Putting It All Back Together

Throughout all the data analysis we’ve done, the datasets have become more fragmented - lexical recall, gist, and eye tracking datasets. I want to put them all together in one whole dataset again so we can perform some analyses more efficiently (particularly correlations). The only thing I need to remember is we’ll have a new column called eye_exclude and if it is set to TRUE it means we can’t include that row in any analysis relating to eye gaze (usually because that trial was less than 25% looking).

# Libraries
library(tidyverse)
library(lme4)
library(lmerTest)
library(scales)
library(viridis)
library(agricolae) 
library(GGally)
library(ez)
# Load lex and eye data
cleanlexdata <- read_csv("cleandata.csv") %>%
  select(-(forehead:total))
cleaneyedata <- read_csv("cleanpercentdata.csv") %>%
  spread(aoi,percent) %>%
  add_column(eye_exclude = FALSE)
# What rows were removed from the eye data back in 03eyegaze? Let's add back in
# With a new column - eye_exclude
removed <- anti_join(cleanlexdata, cleaneyedata) %>%
  add_column(eye_exclude = TRUE)
eyelexdata <- bind_rows(cleaneyedata, removed)
# Load gist data
gist <- read_csv('gist_indiv.csv', col_types = cols(
  participant = col_character(),
  gist.fw1 = col_integer(),
  gist.rv2 = col_integer(),
  gist.fw3 = col_integer(),
  gist.rv4 = col_integer()
)) %>%
  gather(video, gist, gist.fw1:gist.rv4) %>%
  mutate(video = str_sub(video,6,8))
# Presto, our full reunified dataset - 'fulldata'
# But I want to remove columns I don't want anymore and will recalculate later
fulldata <- left_join(eyelexdata, gist) %>%
  select(-moutheye, -facechest, -face, -chest)

Group Changes and Participant Tables

We have some changes to make to the groups. First, fix Josh as learning ASL when he was 6. Next, drop the DeafNative Group and reclassify all who learned ASL < 3.9 as DeafEarly and ASL => 4.0 as DeafLate.

# Change Josh's AoASL to 6
fulldata <- fulldata %>%
  mutate(aoasl = as.double(aoasl)) %>%
  mutate(aoasl = case_when(
    participant == "Josh" ~ 6,
    TRUE ~ aoasl
  ))
# Reclassify Groups
fulldata <- fulldata %>%
  mutate(maingroup = case_when(
    hearing == "Deaf" & aoasl < 4 ~ "DeafEarly",
    hearing == "Deaf" & aoasl >= 4 ~ "DeafLate",
    maingroup == "HearingLateASL" ~ "HearingLate",
    maingroup == "HearingNoviceASL" ~ "HearingNovice"
  ))
# Create Participant Demographics Table
participant_info <- fulldata %>%
  select(-(acc:gist)) %>%
  select(-(video:direction)) %>%
  distinct() %>% 
  group_by(maingroup) %>%
  summarise(n = n(),
            age_mean = mean(age),
            age_sd = sd(age),
            aoasl_mean = mean(aoasl),
            aoasl_sd = sd(aoasl),
            signyrs_mean = mean(signyrs),
            signyrs_sd = sd(signyrs),
            selfrate_mean = mean(selfrate),
            selfrate_sd = sd(selfrate)) %>%
  ungroup() %>%
  mutate_if(is.double, funs(round(., 2))) %>%
  mutate(age = paste(age_mean, "±", age_sd, sep = " "),
         aoasl = paste(aoasl_mean, "±", aoasl_sd, sep = " "),
         signyrs = paste(signyrs_mean, "±", signyrs_sd, sep = " "),
         selfrate = paste(selfrate_mean, "±", selfrate_sd, sep = " ")) %>%
  select(-(age_mean:selfrate_sd))
participant_info
write_csv(fulldata, "finaldataset.csv")
data_lowaoi <- fulldata %>% select(participant, story, belly:upperchest) %>% select(-eyes, -mouth, -chin) %>% gather(aoi, percent, belly:upperchest)
data_lowaoi$percent[is.na(data_lowaoi$percent)] <- 0
mean(data_lowaoi$percent, na.rm=TRUE)
[1] 0.007421356
sd(data_lowaoi$percent, na.rm=TRUE)
[1] 0.02793204

Participant ANOVAs

Below are the ANOVA outputs for participant demographics, and LSDs for each.

Participants’ age

            Df Sum Sq Mean Sq F value   Pr(>F)    
maingroup    3   1810   603.3   14.29 8.75e-07 ***
Residuals   48   2026    42.2                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Participants’ AoASL

            Df Sum Sq Mean Sq F value Pr(>F)    
maingroup    3 2553.9   851.3   89.98 <2e-16 ***
Residuals   48  454.1     9.5                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Participants’ Sign Yrs

            Df Sum Sq Mean Sq F value   Pr(>F)    
maingroup    3   7032  2344.1   59.37 3.52e-16 ***
Residuals   48   1895    39.5                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Participants’ Self-Rating

            Df Sum Sq Mean Sq F value Pr(>F)    
maingroup    3  30.71  10.237   72.37 <2e-16 ***
Residuals   48   6.79   0.141                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Gist & Lexical Recall Data

Tables & Charts

Let’s generate a table for lexical recall and gist for forward vs. reversed stories.

lexgist_info <- fulldata %>%
  group_by(maingroup, direction) %>%
  summarise(lex_mean = mean(acc, na.rm = TRUE),
            lex_sd = sd(acc, na.rm = TRUE),
            gist_mean = mean(gist),
            gist_sd = sd(gist)) %>%
  ungroup() %>%
  mutate_if(is.double, funs(round(., 2))) %>% 
  mutate(lex = paste(lex_mean, "±", lex_sd, sep = " "),
         gist = paste(gist_mean, "±", gist_sd, sep = " ")) %>%
  select(-(lex_mean:gist_sd)) %>%
  gather(metric, value, lex:gist) %>%
  unite("metric", c(metric, direction), sep = "_") %>%
  spread(metric, value) %>%
  print()

And then bar charts too after that with error bars.

# Gist bar chart
gist_bar <- fulldata %>% select(participant, maingroup, direction, gist) %>%
  group_by(maingroup, participant, direction) %>%
  summarise(gist = mean(gist)) %>%
  group_by(maingroup, direction) %>%
  summarise(mean = mean(gist),
            sd = sd(gist),
            count = n(),
            se = sd/sqrt(count)) %>%
  ungroup() %>%
  mutate(maingroup = case_when(
    maingroup == "DeafEarly" ~ "Deaf Early",
    maingroup == "DeafLate" ~ "Deaf Late",
    maingroup == "HearingLate" ~ "Hearing Late",
    maingroup == "HearingNovice" ~ "Hearing Novice"
    ))
ggplot(gist_bar, aes(x = maingroup, y = mean, fill = direction)) +
  geom_bar(stat = "identity", position = position_dodge()) + 
  geom_errorbar(aes(ymin = mean-se, ymax = mean+se), position = position_dodge(0.9), width = 0.5) +
  labs(title = "Gist", x = "", y = "mean gist accuracy") +
  scale_y_continuous(labels = percent, limits = c(0,1)) + theme_bw()

# Lex bar chart
lex_bar <- fulldata %>% select(participant, maingroup, direction, acc) %>%
  group_by(maingroup, participant, direction) %>%
  summarise(acc = mean(acc, na.rm = TRUE)) %>%
  group_by(maingroup, direction) %>%
  summarise(mean = mean(acc, na.rm = TRUE),
            sd = sd(acc, na.rm = TRUE),
            count = n(),
            se = sd/sqrt(count)) %>%
  ungroup() %>%
  mutate(maingroup = case_when(
    maingroup == "DeafEarly" ~ "Deaf Early",
    maingroup == "DeafLate" ~ "Deaf Late",
    maingroup == "HearingLate" ~ "Hearing Late",
    maingroup == "HearingNovice" ~ "Hearing Novice"
    ))
ggplot(lex_bar, aes(x = maingroup, y = mean, fill = direction)) +
  geom_bar(stat = "identity", position = position_dodge()) + 
  geom_errorbar(aes(ymin = mean-se, ymax = mean+se), position = position_dodge(0.9), width = 0.5) +
  labs(title = "Lexical Recall", x = "", y = "mean lexical recall accuracy") +
  scale_y_continuous(labels = percent, limits = c(0,1)) +
  geom_hline(yintercept = .5, linetype = "dotted") +
  coord_cartesian(ylim = c(.5,1)) + theme_bw()

And let’s calculate the average reduction in score due to reversal first is lex recall, then gist.

reversal_lex <- fulldata %>%
  group_by(id, direction) %>%
  summarise(lex_mean = mean(acc, na.rm = TRUE)) %>%
  spread(direction, lex_mean) %>%
  group_by(id) %>%
  mutate(reversal = forward - reversed) %>%
  ungroup()
paste("lex mean", mean(reversal_lex$reversal))
[1] "lex mean 0.141570192307692"
paste("lex sd", sd(reversal_lex$reversal))
[1] "lex sd 0.102655144785552"
reversal_gist <- fulldata %>%
  group_by(id, direction) %>%
  summarise(gist_mean = mean(gist, na.rm = TRUE)) %>%
  spread(direction, gist_mean) %>%
  group_by(id) %>%
  mutate(reversal = forward - reversed) %>%
  ungroup()
paste("gist mean", mean(reversal_gist$reversal))
[1] "gist mean 0.451923076923077"
paste("gist sd", sd(reversal_gist$reversal))
[1] "gist sd 0.39925930667527"

ANOVA Plan

Next, we’re going to do ANOVAs. We’ll always do it in this order.

  1. ANOVA with factors MainGroup & Direction
  2. ANOVA with factor MainGroup, for Forward only
  3. ANOVA with factor MainGroup, for Reverse only

(I also ran ANCOVAs before but now have taken them out…they are below: (4) ANCOVA with factor Direction, and covariate AoASL and Age, (5) Regression with variables AoASL and Age, for Forward only, (6) Regression with variables AoASL and Age, for Reverse only.)

I did not include Age as a covariate in the first 3 ANOVAs because they did not add to or change the model in any significant way.

Gist ANOVAs

  1. ANOVA with factors MainGroup & Direction.
# First let's make the participant-level dataset with which we'll do our ANCOVAs. 
participant_data <- fulldata %>%
  group_by(maingroup, participant, direction) %>%
  mutate(gist = mean(gist, na.rm = TRUE),
         acc = mean(acc, na.rm = TRUE)) %>%
  ungroup() %>%
  select(id, participant, hearing, maingroup, direction, age, aoasl, acc, gist) %>%
  distinct() %>%
  mutate(id = factor(id),
         participant = factor(participant),
         hearing = factor(hearing),
         maingroup = factor(maingroup),
         direction = factor(direction))
# # Gist ANOVA 1
# gist_aov1 <- aov(gist ~ maingroup * direction, data = participant_data)
# summary(gist_aov1)
# gist_lsd1 <- LSD.test(gist_aov1, "maingroup", group = FALSE)
# gist_lsd1$comparison
# Gist EZ ANOVA
ezANOVA(
  data = participant_data,
  dv = gist,
  wid = id,
  within = direction,
  between = maingroup,
  type = 3
)["ANOVA"]
Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Forward only. In the code is a Kruskal-Wallis test. And Chi-Sq too.
# # Gist ANOVA 2
# gist_aov2 <- aov(gist ~ maingroup, data = filter(participant_data, direction == "forward"))
# summary(gist_aov2)
# gist_lsd2 <- LSD.test(gist_aov2, "maingroup", group = FALSE)
# gist_lsd2$comparison
ezANOVA(
  data = filter(participant_data, direction == "forward"),
  dv = gist,
  wid = id,
  between = maingroup,
  type = 3
)["ANOVA"]
Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
# # KW Non-parametric test (like one-way ANOVA)
# kruskal.test(gist ~ maingroup, data = as.matrix(filter(participant_data, direction == "forward")))
# 
# # Chi Sq
# gist_chisq_fw <- participant_data %>%
#   ungroup() %>%
#   filter(direction == "forward") %>%
#   select(maingroup, gist) %>%
#   group_by(maingroup, gist) %>%
#   summarise(count = n()) %>%
#   spread(gist, count) %>%
#   rename(none = "0",
#          one = "0.5",
#          both = "1")
# 
# gist_chisq_fw[is.na(gist_chisq_fw)] <- 0L
# gist_chisq_fw <- cbind(gist_chisq_fw[,"none"], gist_chisq_fw[,"one"], gist_chisq_fw[,"both"])
# chisq.test(gist_chisq_fw)
  1. ANOVA with factor MainGroup, for Reverse only. In the code is a Kruskal-Wallis test. And Chi-Sq too.
# # Gist ANOVA 3
# gist_aov3 <- aov(gist ~ maingroup, data = filter(participant_data, direction == "reversed"))
# summary(gist_aov3)
# gist_lsd3 <- LSD.test(gist_aov3, "maingroup", group = FALSE)
# gist_lsd3$comparison 
ezANOVA(
  data = filter(participant_data, direction == "reversed"),
  dv = gist,
  wid = id,
  between = maingroup,
  type = 3
)["ANOVA"]
Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
# # KW Non-parametric test (like one-way ANOVA)
# kruskal.test(gist ~ maingroup, data = as.matrix(filter(participant_data, direction == "reversed")))
# 
# # Chi Sq
# gist_chisq_rv <- participant_data %>%
#   ungroup() %>%
#   filter(direction == "reversed") %>%
#   select(maingroup, gist) %>%
#   group_by(maingroup, gist) %>%
#   summarise(count = n()) %>%
#   spread(gist, count) %>%
#   rename(none = "0",
#          one = "0.5",
#          both = "1")
# 
# gist_chisq_rv[is.na(gist_chisq_rv)] <- 0L
# gist_chisq_rv <- cbind(gist_chisq_rv[,"none"], gist_chisq_rv[,"one"], gist_chisq_rv[,"both"])
# chisq.test(gist_chisq_rv)

Lexical Recall ANOVAs

  1. ANOVA with factors MainGroup & Direction.
# # Lexical Recall ANOVA 1
# acc_aov1 <- aov(acc ~ maingroup * direction, data = participant_data)
# summary(acc_aov1)
# acc_lsd1 <- LSD.test(acc_aov1, "maingroup", group = FALSE)
# acc_lsd1$comparison
ezANOVA(
  data = participant_data,
  dv = acc,
  wid = id,
  within = direction,
  between = maingroup,
  type = 3
)["ANOVA"]
Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Forward only.
# # Lexical Recall ANOVA 2
# acc_aov2 <- aov(acc ~ maingroup, data = filter(participant_data, direction == "forward"))
# summary(acc_aov2)
# acc_lsd2 <- LSD.test(acc_aov2, "maingroup", group = FALSE)
# acc_lsd2$comparison
ezANOVA(
  data = filter(participant_data, direction == "forward"),
  dv = acc,
  wid = id,
  between = maingroup,
  type = 3
)["ANOVA"]
Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Reverse only.
# # Lexical Recall ANOVA 3
# acc_aov3 <- aov(acc ~ maingroup, data = filter(participant_data, direction == "reversed"))
# summary(acc_aov3)
# acc_lsd3 <- LSD.test(acc_aov3, "maingroup", group = FALSE)
# acc_lsd3$comparison
ezANOVA(
  data = filter(participant_data, direction == "reversed"),
  dv = acc,
  wid = id,
  between = maingroup,
  type = 3
)["ANOVA"]
Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA

AoA Correlations

Next, we want to look at correlations between AoA and Gist, and betwen AoA and Lexical Recall. Rain asked for forward and reversed separately (1) deaf only, (2) hearing only, and (3) both. Let’s make it work.

# Let's make participant-level data, and have forward/reversed in separate columns
lexgist_data <- fulldata %>%
  group_by(maingroup, participant, direction) %>%
  mutate(gist = mean(gist, na.rm = TRUE),
         lex = mean(acc, na.rm = TRUE)) %>%
  ungroup() %>%
  select(maingroup, participant, hearing, direction, aoasl, signyrs, age, gist, lex) %>%
  distinct() %>%
  gather(metric, value, gist:lex) %>%
  unite(metricvalue, c(metric, direction), sep = "_") %>%
  spread(metricvalue, value) %>%
  select(-participant, -maingroup)
lexgist_deaf <- lexgist_data %>% filter(hearing == "Deaf") %>% select(-hearing)
lexgist_hearing <- lexgist_data %>% filter(hearing == "Hearing") %>% select(-hearing)
lexgist_all <- lexgist_data %>% select(-hearing)
# Load awesome function to make correlation tables with stars for significance
# From: https://myowelt.blogspot.co.uk/2008/04/beautiful-correlation-tables-in-r.html
corstarsl <- function(x){ 
require(Hmisc) 
x <- as.matrix(x) 
R <- Hmisc::rcorr(x)$r 
p <- Hmisc::rcorr(x)$P 
## define notions for significance levels; spacing is important.
mystars <- ifelse(p < .001, "***", ifelse(p < .01, "** ", ifelse(p < .05, "* ", " ")))
## trunctuate the matrix that holds the correlations to two decimal
R <- format(round(cbind(rep(-1.11, ncol(x)), R), 2))[,-1] 
## build a new matrix that includes the correlations with their apropriate stars 
Rnew <- matrix(paste(R, mystars, sep=""), ncol=ncol(x)) 
diag(Rnew) <- paste(diag(R), " ", sep="") 
rownames(Rnew) <- colnames(x) 
colnames(Rnew) <- paste(colnames(x), "", sep="") 
## remove upper triangle
Rnew <- as.matrix(Rnew)
Rnew[upper.tri(Rnew, diag = TRUE)] <- ""
Rnew <- as.data.frame(Rnew) 
## remove last column and return the matrix (which is now a data frame)
Rnew <- cbind(Rnew[1:length(Rnew)-1])
return(Rnew) 
}
# Correlations for Deaf
print("DEAF Correlations - Pearson's r")
[1] "DEAF Correlations - Pearson's r"
#corstarsl(lexgist_deaf)
Hmisc::rcorr(as.matrix(lexgist_deaf))$r
                    aoasl     signyrs        age gist_forward gist_reversed lex_forward lex_reversed
aoasl          1.00000000 -0.50188273  0.2569266   0.08266371   -0.25585943  0.14743346  -0.25601873
signyrs       -0.50188273  1.00000000  0.7005996   0.18321127   -0.01264108  0.27968505   0.06666998
age            0.25692660  0.70059955  1.0000000   0.27454460   -0.17264941  0.42997837  -0.12765634
gist_forward   0.08266371  0.18321127  0.2745446   1.00000000    0.01762269 -0.08155560  -0.09770666
gist_reversed -0.25585943 -0.01264108 -0.1726494   0.01762269    1.00000000  0.02667231   0.36021802
lex_forward    0.14743346  0.27968505  0.4299784  -0.08155560    0.02667231  1.00000000   0.35984892
lex_reversed  -0.25601873  0.06666998 -0.1276563  -0.09770666    0.36021802  0.35984892   1.00000000
print("DEAF Correlations - P-values")
[1] "DEAF Correlations - P-values"
Hmisc::rcorr(as.matrix(lexgist_deaf))$P
                    aoasl      signyrs          age gist_forward gist_reversed lex_forward lex_reversed
aoasl                  NA 5.536857e-03 1.784812e-01    0.6698839    0.18035489  0.44533530   0.18007434
signyrs       0.005536857           NA 2.316796e-05    0.3414473    0.94810844  0.14172236   0.73113301
age           0.178481213 2.316796e-05           NA    0.1495001    0.37046625  0.01990877   0.50930544
gist_forward  0.669883883 3.414473e-01 1.495001e-01           NA    0.92770438  0.67406661   0.61409897
gist_reversed 0.180354888 9.481084e-01 3.704662e-01    0.9277044            NA  0.89076140   0.05492031
lex_forward   0.445335297 1.417224e-01 1.990877e-02    0.6740666    0.89076140          NA   0.05518766
lex_reversed  0.180074336 7.311330e-01 5.093054e-01    0.6140990    0.05492031  0.05518766           NA
cat(paste("","\n",""))
# Correlations for Hearing
print("HEARING Correlations - Pearson's r")
[1] "HEARING Correlations - Pearson's r"
#corstarsl(lexgist_hearing)
Hmisc::rcorr(as.matrix(lexgist_hearing))$r
                    aoasl     signyrs       age gist_forward gist_reversed lex_forward lex_reversed
aoasl          1.00000000 -0.07887013 0.3468184  -0.15525565    0.07815751  0.02500269   0.01411303
signyrs       -0.07887013  1.00000000 0.9021947   0.57814670    0.28845748  0.36725658   0.20828810
age            0.34681845  0.90219468 1.0000000   0.44651473    0.30963454  0.30931753   0.20139593
gist_forward  -0.15525565  0.57814670 0.4465147   1.00000000    0.29502174  0.57154566   0.07645807
gist_reversed  0.07815751  0.28845748 0.3096345   0.29502174    1.00000000  0.35682374   0.57951176
lex_forward    0.02500269  0.36725658 0.3093175   0.57154566    0.35682374  1.00000000   0.36558339
lex_reversed   0.01411303  0.20828810 0.2013959   0.07645807    0.57951176  0.36558339   1.00000000
print("HEARING Correlations - P-values")
[1] "HEARING Correlations - P-values"
Hmisc::rcorr(as.matrix(lexgist_hearing))$P
                  aoasl      signyrs          age gist_forward gist_reversed lex_forward lex_reversed
aoasl                NA 7.205586e-01 1.049514e-01  0.479339909   0.722986497 0.909841021  0.949040176
signyrs       0.7205586           NA 4.046899e-09  0.003857505   0.181932462 0.084723426  0.340222805
age           0.1049514 4.046899e-09           NA  0.032691671   0.150502508 0.150942632  0.356794880
gist_forward  0.4793399 3.857505e-03 3.269167e-02           NA   0.171744860 0.004385475  0.728786878
gist_reversed 0.7229865 1.819325e-01 1.505025e-01  0.171744860            NA 0.094647552  0.003755275
lex_forward   0.9098410 8.472343e-02 1.509426e-01  0.004385475   0.094647552          NA  0.086260140
lex_reversed  0.9490402 3.402228e-01 3.567949e-01  0.728786878   0.003755275 0.086260140           NA
cat(paste("","\n",""))
# Correlations for All
print("ALL Correlations - Pearson's r")
[1] "ALL Correlations - Pearson's r"
#corstarsl(lexgist_all)
Hmisc::rcorr(as.matrix(lexgist_all))$r
                    aoasl    signyrs        age gist_forward gist_reversed lex_forward lex_reversed
aoasl          1.00000000 -0.7852245 -0.3136458   -0.3230903    -0.3922803 -0.08115845   -0.3394521
signyrs       -0.78522450  1.0000000  0.8314757    0.4956183     0.3356193  0.29698992    0.3182316
age           -0.31364575  0.8314757  1.0000000    0.4602616     0.1930257  0.36318284    0.1886432
gist_forward  -0.32309031  0.4956183  0.4602616    1.0000000     0.2712761  0.49279109    0.1521110
gist_reversed -0.39228034  0.3356193  0.1930257    0.2712761     1.0000000  0.21701819    0.4921550
lex_forward   -0.08115845  0.2969899  0.3631828    0.4927911     0.2170182  1.00000000    0.3800772
lex_reversed  -0.33945209  0.3182316  0.1886432    0.1521110     0.4921550  0.38007715    1.0000000
print("ALL Correlations - P-values")
[1] "ALL Correlations - P-values"
Hmisc::rcorr(as.matrix(lexgist_all))$P
                     aoasl      signyrs          age gist_forward gist_reversed  lex_forward lex_reversed
aoasl                   NA 5.523138e-12 2.356068e-02 0.0194786567  0.0040239673 0.5673489939 0.0138201778
signyrs       5.523138e-12           NA 2.309264e-14 0.0001870211  0.0150006737 0.0325116001 0.0214967644
age           2.356068e-02 2.309264e-14           NA 0.0005965582  0.1703671221 0.0081373882 0.1804672184
gist_forward  1.947866e-02 1.870211e-04 5.965582e-04           NA  0.0517394597 0.0002061625 0.2817023354
gist_reversed 4.023967e-03 1.500067e-02 1.703671e-01 0.0517394597            NA 0.1222542968 0.0002107074
lex_forward   5.673490e-01 3.251160e-02 8.137388e-03 0.0002061625  0.1222542968           NA 0.0054478274
lex_reversed  1.382018e-02 2.149676e-02 1.804672e-01 0.2817023354  0.0002107074 0.0054478274           NA

I’m also including nicely formatted tables with *** indicators of significance for quick referencing. Order: Deaf, Hearing, All.

corstarsl(lexgist_deaf)
corstarsl(lexgist_hearing)
corstarsl(lexgist_all)

Scatterplot of Correlations

Let’s visualize what’s happening with the correlations here.

ggpairs(lexgist_data, columns = c(2:8), aes(color = hearing))

 plot: [1,1] [==--------------------------------------------------------------------------]  2% est: 0s 
 plot: [1,2] [===-------------------------------------------------------------------------]  4% est: 4s 
 plot: [1,3] [=====-----------------------------------------------------------------------]  6% est: 5s 
 plot: [1,4] [======----------------------------------------------------------------------]  8% est: 6s 
 plot: [1,5] [========--------------------------------------------------------------------] 10% est: 6s 
 plot: [1,6] [=========-------------------------------------------------------------------] 12% est: 6s 
 plot: [1,7] [===========-----------------------------------------------------------------] 14% est: 5s 
 plot: [2,1] [============----------------------------------------------------------------] 16% est: 5s 
 plot: [2,2] [==============--------------------------------------------------------------] 18% est: 5s 
 plot: [2,3] [================------------------------------------------------------------] 20% est: 5s 
 plot: [2,4] [=================-----------------------------------------------------------] 22% est: 5s 
 plot: [2,5] [===================---------------------------------------------------------] 24% est: 5s 
 plot: [2,6] [====================--------------------------------------------------------] 27% est: 4s 
 plot: [2,7] [======================------------------------------------------------------] 29% est: 4s 
 plot: [3,1] [=======================-----------------------------------------------------] 31% est: 4s 
 plot: [3,2] [=========================---------------------------------------------------] 33% est: 4s 
 plot: [3,3] [==========================--------------------------------------------------] 35% est: 4s 
 plot: [3,4] [============================------------------------------------------------] 37% est: 4s 
 plot: [3,5] [=============================-----------------------------------------------] 39% est: 4s 
 plot: [3,6] [===============================---------------------------------------------] 41% est: 4s 
 plot: [3,7] [=================================-------------------------------------------] 43% est: 4s 
 plot: [4,1] [==================================------------------------------------------] 45% est: 3s 
 plot: [4,2] [====================================----------------------------------------] 47% est: 3s 
 plot: [4,3] [=====================================---------------------------------------] 49% est: 3s 
 plot: [4,4] [=======================================-------------------------------------] 51% est: 3s 
 plot: [4,5] [========================================------------------------------------] 53% est: 3s 
 plot: [4,6] [==========================================----------------------------------] 55% est: 3s 
 plot: [4,7] [===========================================---------------------------------] 57% est: 3s 
 plot: [5,1] [=============================================-------------------------------] 59% est: 3s 
 plot: [5,2] [===============================================-----------------------------] 61% est: 2s 
 plot: [5,3] [================================================----------------------------] 63% est: 2s 
 plot: [5,4] [==================================================--------------------------] 65% est: 2s 
 plot: [5,5] [===================================================-------------------------] 67% est: 2s 
 plot: [5,6] [=====================================================-----------------------] 69% est: 2s 
 plot: [5,7] [======================================================----------------------] 71% est: 2s 
 plot: [6,1] [========================================================--------------------] 73% est: 2s 
 plot: [6,2] [=========================================================-------------------] 76% est: 2s 
 plot: [6,3] [===========================================================-----------------] 78% est: 1s 
 plot: [6,4] [============================================================----------------] 80% est: 1s 
 plot: [6,5] [==============================================================--------------] 82% est: 1s 
 plot: [6,6] [================================================================------------] 84% est: 1s 
 plot: [6,7] [=================================================================-----------] 86% est: 1s 
 plot: [7,1] [===================================================================---------] 88% est: 1s 
 plot: [7,2] [====================================================================--------] 90% est: 1s 
 plot: [7,3] [======================================================================------] 92% est: 1s 
 plot: [7,4] [=======================================================================-----] 94% est: 0s 
 plot: [7,5] [=========================================================================---] 96% est: 0s 
 plot: [7,6] [==========================================================================--] 98% est: 0s 
 plot: [7,7] [============================================================================]100% est: 0s 
                                                                                                        

Eye Gaze Data

Now eye gaze data. Boxplots first. Also here, we’re renaming “chin” to “neck” because that’s what it actually is! But we also have to fix all NA’s in the percentages to zeros, becuase that’s what they actually are.

# rename chin to neck
fulldata <- fulldata %>%
  rename(neck = chin) %>%
  gather(aoi, percent, belly:upperchest)
# Fix all NA's in Percent column to 0
fixpercent <- fulldata$percent
fulldata$percent <- coalesce(fixpercent, 0)
fulldata <- fulldata %>%
  spread(aoi, percent)
fulldata %>%
  filter(eye_exclude == FALSE) %>%
  select(direction, belly:upperchest) %>%
  gather(aoi, percent, belly:upperchest) %>%
  ggplot(aes(x = aoi, y = percent, fill = direction)) + geom_boxplot()

But let’s try error charts too! Instead of boxplots.

fulldata_error <- fulldata %>%
  filter(eye_exclude == FALSE) %>%
  gather(aoi, percent, belly:upperchest) %>%
  group_by(id, direction, aoi) %>%
  summarise(percent = mean(percent, na.rm = TRUE)) %>%
  ungroup() %>%
  distinct() %>%
  group_by(direction, aoi) %>%
  summarise(mean = mean(percent, na.rm = TRUE),
            sd = sd(percent, na.rm = TRUE),
            count = n(),
            se = sd/sqrt(count))
fulldata_error$aoi <- fct_relevel(fulldata_error$aoi, c("forehead","eyes","mouth","neck","upperchest",
                                                        "midchest","lowerchest","belly","left","right"))
fulldata_error %>%
  ggplot(aes(x = aoi, y = mean, fill = direction)) + 
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_errorbar(aes(ymin = mean-se, ymax = mean+se), position = position_dodge(0.9), width = 0.5) +
  labs(title = "Eye Gaze Behavior", x = "", y = "looking time") +
  scale_y_continuous(labels = percent, limits = c(0,.70)) + 
  theme_bw() +
  theme(axis.text.x = element_text(angle = 30, hjust = 1, vjust = 1))

And a table of eye gaze results too

fulldata_gazetable <- fulldata %>%
  filter(eye_exclude == FALSE) %>%
  gather(aoi, percent, belly:upperchest) %>%
  group_by(id, maingroup, direction, aoi) %>%
  summarise(percent = mean(percent, na.rm = TRUE)) %>%
  ungroup() %>%
  distinct() %>%
  group_by(maingroup, direction, aoi) %>%
  summarise(mean = mean(percent, na.rm = TRUE),
            sd = sd(percent, na.rm = TRUE)) %>%
  mutate(mean = round(mean*100,1),
         sd = round(sd*100,1)) %>%
  mutate(value = paste(mean, sd, sep = " ± ")) %>%
  mutate(value = paste(value, "%", sep = ""))
fulldata_gazetable$aoi <- fct_relevel(fulldata_gazetable$aoi, c("forehead","eyes","mouth","neck","upperchest",
                                                        "midchest","lowerchest","belly","left","right"))
fulldata_gazetable %>% 
  ungroup() %>%
  select(-mean, -sd) %>% 
  spread(aoi, value)
fulldata_total <- fulldata %>%
  filter(eye_exclude == FALSE) %>%
  gather(aoi, percent, belly:upperchest) %>%
  group_by(aoi) %>%
  summarise(percent = mean(percent, na.rm = TRUE)) %>%
  spread(aoi, percent)
#sum(fulldata_total$eyes, fulldata_total$mouth, fulldata_total$neck)
#fulldata_total$left
#fulldata_total$right

Big Three-Way ANOVA

Now we’re going to try a three-way Group x Direction x AOI ANOVA with the top 3 AOIs (Eyes, Mouth, Neck)

$ANOVA
                   Effect DFn DFd          F            p p<.05          ges
2               maingroup   3  47  3.0877532 3.602912e-02     * 0.0019613548
3               direction   1  47 14.6917045 3.751848e-04     * 0.0008045246
5                     aoi   2  94 38.9261560 4.838451e-13     * 0.4115853001
4     maingroup:direction   3  47  0.8509636 4.731139e-01       0.0001398905
6           maingroup:aoi   6  94  1.1224334 3.553342e-01       0.0570561521
7           direction:aoi   2  94  7.0028846 1.462185e-03     * 0.0208462714
8 maingroup:direction:aoi   6  94  0.6318533 7.044042e-01       0.0057298396

Left Vs Right

$ANOVA
         Effect DFn DFd         F          p p<.05        ges
2     maingroup   3  47 2.5418616 0.06755936       0.09343220
3           aoi   1  47 1.8880127 0.17594392       0.01444195
4 maingroup:aoi   3  47 0.8434728 0.47700559       0.01926124

Interactions Visualization

So we have significant maingroup:aoi and direction:aoi interactions. Let’s try to visualize what can be driving these. We can go back to the SEM chart but break it down…

First are the maingroup:aoi charts The error bars are not 100% accurate, I took a quick-n-easy way around

aoi3_interactions_maingroupaoi <- fulldata %>%
  filter(eye_exclude == FALSE) %>%
  select(id, participant, maingroup, direction, eyes, mouth, neck) %>%
  gather(aoi, percent, c(eyes, mouth, neck)) %>%
  group_by(id, maingroup, direction, aoi) %>%
  mutate(percent = mean(percent, na.rm = TRUE)) %>%
  distinct() %>%
  group_by(maingroup, aoi) %>%
  summarise(mean = mean(percent, na.rm = TRUE),
            sd = sd(percent, na.rm = TRUE),
            count = n()/2,
            se = sd/sqrt(count))
# I need to first collapse across stories for each participant...here I didn't. Must fix later.
aoi3_interactions_maingroupaoi %>% 
  ggplot(aes(x = aoi, y = mean, fill = maingroup)) + 
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_errorbar(aes(ymin = mean-se, ymax = mean+se), position = position_dodge(0.9), width = 0.5) +
  labs(title = "MainGroup & AOI Interaction 1", subtitle = "Error bars represent SE", x = "", y = "percent looking") +
  scale_y_continuous(labels = percent)

aoi3_interactions_maingroupaoi %>% 
  ggplot(aes(x = maingroup, y = mean, fill = aoi)) + 
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_errorbar(aes(ymin = mean-se, ymax = mean+se), position = position_dodge(0.9), width = 0.5) +
  labs(title = "MainGroup & AOI Interaction 2", subtitle = "Error bars represent SE", x = "", y = "percent looking") +
  scale_y_continuous(labels = percent)

First are the direction:aoi charts The error bars are not 100% accurate, I took a quick-n-easy way around

aoi3_interactions_directionaoi <- fulldata %>%
  filter(eye_exclude == FALSE) %>%
  select(id, participant, maingroup, direction, eyes, mouth, neck) %>%
  gather(aoi, percent, c(eyes, mouth, neck)) %>%
  group_by(id, maingroup, direction, aoi) %>%
  mutate(percent = mean(percent, na.rm = TRUE)) %>%
  distinct() %>%
  group_by(direction, aoi) %>%
  summarise(mean = mean(percent, na.rm = TRUE),
            sd = sd(percent, na.rm = TRUE),
            count = n(),
            se = sd/sqrt(count))
# I need to first collapse across stories for each participant...here I didn't. Must fix later.
aoi3_interactions_directionaoi %>% 
  ggplot(aes(x = aoi, y = mean, fill = direction)) + 
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_errorbar(aes(ymin = mean-se, ymax = mean+se), position = position_dodge(0.9), width = 0.5) +
  labs(title = "MainGroup & Direction Interaction 1", subtitle = "Error bars represent SE", x = "", y = "percent looking") +
  scale_y_continuous(labels = percent)

aoi3_interactions_directionaoi %>% 
  ggplot(aes(x = direction, y = mean, fill = aoi)) + 
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_errorbar(aes(ymin = mean-se, ymax = mean+se), position = position_dodge(0.9), width = 0.5) +
  labs(title = "MainGroup & Direction Interaction 2", subtitle = "Error bars represent SE", x = "", y = "percent looking") +
  scale_y_continuous(labels = percent)

All the AOI means

Let’s get tables of our means here, in various configurations

Eyes

  1. ANOVA with factors MainGroup & Direction.
Converting "id" to factor for ANOVA.Converting "direction" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Forward only.
Converting "id" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Reverse only.
Converting "id" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA

Mouth

  1. ANOVA with factors MainGroup & Direction.
Converting "id" to factor for ANOVA.Converting "direction" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Forward only.
Converting "id" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Reverse only.
Converting "id" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA

Neck

  1. ANOVA with factors MainGroup & Direction.
Converting "id" to factor for ANOVA.Converting "direction" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Forward only.
Converting "id" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Reverse only.
Converting "id" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA

FaceChest

We originally defined FaceChest such that

  1. Face = eyes + mouth + chin
  2. Chest = upperchest + midchest + lowerchest

BUT. Chin is actually neck. It’s not even part of the face if you think about it. So I’m redefining FaceChest as:

  1. Face = forehead + eyes + mouth
  2. Chest = neck + upperchest + midchest + lowerchest

So let’s do this. Then see what’s happening across groups for FaceChest.

Cool. Next we’ll do error bar charts using the new FaceChest across groups.

facechest_info <- fulldata %>%
  filter(eye_exclude == FALSE) %>%
  group_by(maingroup, direction, participant) %>%
  summarise(facechest = mean(facechest, na.rm = TRUE)) %>%
  group_by(maingroup, direction) %>%
  summarise(mean = mean(facechest),
            sd = sd(facechest),
            n = n(),
            se = sd/sqrt(n)) %>%
  ungroup() %>%
  mutate(maingroup = case_when(
    maingroup == "DeafEarly" ~ "Deaf Early",
    maingroup == "DeafLate" ~ "Deaf Late",
    maingroup == "HearingLate" ~ "Hearing Late",
    maingroup == "HearingNovice" ~ "Hearing Novice"
    ))
ggplot(facechest_info, aes(x = maingroup, y = mean, fill = direction, color = direction)) +
  geom_point(stat = "identity", position = position_dodge(0.5), size = 2) + 
  geom_errorbar(aes(ymin = mean-se, ymax = mean+se), position = position_dodge(0.5), width = 0.3, size = 1) +
  labs(title = "Face-Chest Ratio", x = "", y = "face-chest ratio") +
  scale_y_continuous(limits = c(-1,1)) + 
  geom_hline(yintercept = 0, linetype = "dotted") +
  theme_bw()

Now let’s do the ANOVAs. Also skipping LSDs here.

  1. ANOVA with factors MainGroup & Direction.
Grouping rowwise data frame strips rowwise natureConverting "id" to factor for ANOVA.Converting "direction" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Forward only.
Converting "id" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA
  1. ANOVA with factor MainGroup, for Reverse only.
Converting "id" to factor for ANOVA.Converting "maingroup" to factor for ANOVA.Data is unbalanced (unequal N per group). Make sure you specified a well-considered value for the type argument to ezANOVA().
$ANOVA
NA

Eye Gaze & Performance Correlations

Next we’re going to correlate our eye gaze metrics (Eye, Mouth, Neck, and FaceChest) with lexical recall and gist. Okay! But remember we have a slightly smaller dataset here because we’ve excluded some participants for having bad eye data (but they had valid behavioral data so we kept them in the AoA-Performance correlations above).

IMPORTANT: We also removed gist_forward column.

eyeperf <- fulldata %>%
  filter(eye_exclude == FALSE) %>%
  select(participant, maingroup, hearing, direction, aoasl, signyrs, selfrate, acc, gist, eyes, mouth, neck, facechest) %>%
  group_by(maingroup, participant, direction) %>%
  mutate(gist = mean(gist, na.rm = TRUE),
         lex = mean(acc, na.rm = TRUE),
         eyes = mean(eyes, na.rm = TRUE),
         mouth = mean(mouth, na.rm = TRUE),
         neck = mean(neck, na.rm = TRUE),
         facechest = mean(facechest, na.rm = TRUE)) %>%
  ungroup() %>%
  select(maingroup, participant, hearing, direction, aoasl, signyrs, selfrate, gist, lex, eyes, mouth, neck, facechest) %>%
  distinct() %>%
  gather(metric, value, gist:facechest) %>%
  unite(metricvalue, c(metric, direction), sep = "_") %>%
  spread(metricvalue, value) %>%
  select(-participant, -maingroup) %>%
  select(hearing, aoasl, signyrs, selfrate, gist_reversed, lex_forward, lex_reversed, eyes_forward,
         eyes_reversed, mouth_forward, mouth_reversed, neck_forward, neck_reversed, 
         facechest_forward, facechest_reversed)
Grouping rowwise data frame strips rowwise nature
eyeperf_deaf <- eyeperf %>% filter(hearing == "Deaf") %>% select(-hearing)
eyeperf_deaf_fw <- eyeperf_deaf %>% select(aoasl, signyrs, selfrate, lex_forward, eyes_forward,
                                           mouth_forward, neck_forward, facechest_forward)
eyeperf_deaf_rv <- eyeperf_deaf %>% select(aoasl, signyrs, selfrate, gist_reversed, lex_reversed,
                                           eyes_reversed, mouth_reversed, neck_reversed, facechest_reversed)
eyeperf_hearing <- eyeperf %>% filter(hearing == "Hearing") %>% select(-hearing)
eyeperf_hearing_fw <- eyeperf_hearing %>% select(aoasl, signyrs, selfrate, lex_forward, eyes_forward,
                                           mouth_forward, neck_forward, facechest_forward)
eyeperf_hearing_rv <- eyeperf_hearing %>% select(aoasl, signyrs, selfrate, gist_reversed, lex_reversed,
                                           eyes_reversed, mouth_reversed, neck_reversed, facechest_reversed)
eyeperf_all <- eyeperf %>% select(-hearing)
eyeperf_all_fw <- eyeperf_all %>% select(aoasl, signyrs, selfrate, lex_forward, eyes_forward,
                                           mouth_forward, neck_forward, facechest_forward)
eyeperf_all_rv <- eyeperf_all %>% select(aoasl, signyrs, selfrate, gist_reversed, lex_reversed,
                                           eyes_reversed, mouth_reversed, neck_reversed, facechest_reversed)

Deaf Correlations, Forward

# Correlations for Deaf
print("DEAF Correlations - Pearson's r")
[1] "DEAF Correlations - Pearson's r"
#corstarsl(lexgist_deaf)
Hmisc::rcorr(as.matrix(eyeperf_deaf_fw))$r
                        aoasl     signyrs selfrate lex_forward eyes_forward mouth_forward neck_forward
aoasl              1.00000000 -0.50188273      NaN   0.1172403   0.06486298    0.17733160   -0.2393697
signyrs           -0.50188273  1.00000000      NaN   0.3851766   0.08415831    0.09383579   -0.1334632
selfrate                  NaN         NaN        1         NaN          NaN           NaN          NaN
lex_forward        0.11724032  0.38517660      NaN   1.0000000   0.19560269    0.11273646   -0.2818219
eyes_forward       0.06486298  0.08415831      NaN   0.1956027   1.00000000   -0.40389580   -0.4021353
mouth_forward      0.17733160  0.09383579      NaN   0.1127365  -0.40389580    1.00000000   -0.6652489
neck_forward      -0.23936971 -0.13346320      NaN  -0.2818219  -0.40213531   -0.66524893    1.0000000
facechest_forward  0.25001433  0.15009922      NaN   0.2796232   0.37868726    0.69180554   -0.9914181
                  facechest_forward
aoasl                     0.2500143
signyrs                   0.1500992
selfrate                        NaN
lex_forward               0.2796232
eyes_forward              0.3786873
mouth_forward             0.6918055
neck_forward             -0.9914181
facechest_forward         1.0000000
print("DEAF Correlations - P-values")
[1] "DEAF Correlations - P-values"
Hmisc::rcorr(as.matrix(eyeperf_deaf_fw))$P
                        aoasl     signyrs selfrate lex_forward eyes_forward mouth_forward neck_forward
aoasl                      NA 0.005536857      NaN  0.54472632   0.73816416  3.574282e-01 2.110728e-01
signyrs           0.005536857          NA      NaN  0.03907663   0.66425759  6.282694e-01 4.900657e-01
selfrate                  NaN         NaN       NA         NaN          NaN           NaN          NaN
lex_forward       0.544726321 0.039076627      NaN          NA   0.30920849  5.603910e-01 1.385770e-01
eyes_forward      0.738164157 0.664257588      NaN  0.30920849           NA  2.978758e-02 3.057654e-02
mouth_forward     0.357428170 0.628269399      NaN  0.56039098   0.02978758            NA 8.235941e-05
neck_forward      0.211072759 0.490065680      NaN  0.13857704   0.03057654  8.235941e-05           NA
facechest_forward 0.190862018 0.437057268      NaN  0.14181424   0.04279116  3.228725e-05 0.000000e+00
                  facechest_forward
aoasl                  1.908620e-01
signyrs                4.370573e-01
selfrate                        NaN
lex_forward            1.418142e-01
eyes_forward           4.279116e-02
mouth_forward          3.228725e-05
neck_forward           0.000000e+00
facechest_forward                NA
cat(paste("","\n",""))
corstarsl(eyeperf_deaf_fw)

Deaf Correlations, Reversed

# Correlations for Deaf
print("DEAF Correlations - Pearson's r")
[1] "DEAF Correlations - Pearson's r"
#corstarsl(lexgist_deaf)
Hmisc::rcorr(as.matrix(eyeperf_deaf_rv))$r
                         aoasl      signyrs selfrate gist_reversed lex_reversed eyes_reversed
aoasl               1.00000000 -0.501882732      NaN   -0.22660857  -0.16780065    0.02247978
signyrs            -0.50188273  1.000000000      NaN   -0.10665206  -0.02521074    0.09583659
selfrate                   NaN          NaN        1           NaN          NaN           NaN
gist_reversed      -0.22660857 -0.106652059      NaN    1.00000000   0.30316901    0.02254098
lex_reversed       -0.16780065 -0.025210742      NaN    0.30316901   1.00000000   -0.07989090
eyes_reversed       0.02247978  0.095836595      NaN    0.02254098  -0.07989090    1.00000000
mouth_reversed      0.30344567  0.007193097      NaN    0.06590948   0.11828493   -0.45147687
neck_reversed      -0.32970390 -0.052028485      NaN   -0.07553297  -0.01236971   -0.42235607
facechest_reversed  0.30789807  0.086108170      NaN    0.08644924   0.03749677    0.43328831
                   mouth_reversed neck_reversed facechest_reversed
aoasl                 0.303445667   -0.32970390         0.30789807
signyrs               0.007193097   -0.05202848         0.08610817
selfrate                      NaN           NaN                NaN
gist_reversed         0.065909483   -0.07553297         0.08644924
lex_reversed          0.118284926   -0.01236971         0.03749677
eyes_reversed        -0.451476872   -0.42235607         0.43328831
mouth_reversed        1.000000000   -0.59771758         0.59842563
neck_reversed        -0.597717583    1.00000000        -0.99196124
facechest_reversed    0.598425627   -0.99196124         1.00000000
print("DEAF Correlations - P-values")
[1] "DEAF Correlations - P-values"
Hmisc::rcorr(as.matrix(eyeperf_deaf_rv))$P
                         aoasl     signyrs selfrate gist_reversed lex_reversed eyes_reversed
aoasl                       NA 0.005536857      NaN     0.2462148    0.3933760    0.90960039
signyrs            0.005536857          NA      NaN     0.5890836    0.8986709    0.62759257
selfrate                   NaN         NaN       NA           NaN          NaN           NaN
gist_reversed      0.246214823 0.589083649      NaN            NA    0.1168234    0.90935525
lex_reversed       0.393375956 0.898670879      NaN     0.1168234           NA    0.68612731
eyes_reversed      0.909600391 0.627592567      NaN     0.9093553    0.6861273            NA
mouth_reversed     0.116473224 0.971021367      NaN     0.7389667    0.5488533    0.01588232
neck_reversed      0.086644292 0.792600787      NaN     0.7024562    0.9501866    0.02515937
facechest_reversed 0.110944251 0.663069865      NaN     0.6618134    0.8497523    0.02126289
                   mouth_reversed neck_reversed facechest_reversed
aoasl                0.1164732242  0.0866442923       0.1109442511
signyrs              0.9710213673  0.7926007873       0.6630698653
selfrate                      NaN           NaN                NaN
gist_reversed        0.7389666674  0.7024561767       0.6618134031
lex_reversed         0.5488532932  0.9501866460       0.8497523419
eyes_reversed        0.0158823163  0.0251593680       0.0212628913
mouth_reversed                 NA  0.0007826592       0.0007685904
neck_reversed        0.0007826592            NA       0.0000000000
facechest_reversed   0.0007685904  0.0000000000                 NA
cat(paste("","\n",""))
corstarsl(eyeperf_deaf_rv)

Hearing Correlations, Forward

# Correlations for Hearing
print("HEARING Correlations - Pearson's r")
[1] "HEARING Correlations - Pearson's r"
#corstarsl(lexgist_hearing)
Hmisc::rcorr(as.matrix(eyeperf_hearing_fw))$r
                        aoasl     signyrs     selfrate lex_forward eyes_forward mouth_forward
aoasl              1.00000000 -0.07887013  0.013855614  0.08908092 -0.311357170    0.17806749
signyrs           -0.07887013  1.00000000  0.738478541  0.26130641  0.132498235    0.06609090
selfrate           0.01385561  0.73847854  1.000000000  0.47076830  0.003272709   -0.03631108
lex_forward        0.08908092  0.26130641  0.470768303  1.00000000 -0.206412390    0.04471777
eyes_forward      -0.31135717  0.13249823  0.003272709 -0.20641239  1.000000000   -0.75736409
mouth_forward      0.17806749  0.06609090 -0.036311083  0.04471777 -0.757364094    1.00000000
neck_forward       0.38414940 -0.24596132  0.135873660  0.36551589 -0.547841430   -0.08094060
facechest_forward -0.28903425  0.30186427 -0.017766366 -0.28030962  0.532841146    0.14471392
                  neck_forward facechest_forward
aoasl                0.3841494       -0.28903425
signyrs             -0.2459613        0.30186427
selfrate             0.1358737       -0.01776637
lex_forward          0.3655159       -0.28030962
eyes_forward        -0.5478414        0.53284115
mouth_forward       -0.0809406        0.14471392
neck_forward         1.0000000       -0.94241619
facechest_forward   -0.9424162        1.00000000
print("HEARING Correlations - P-values")
[1] "HEARING Correlations - P-values"
Hmisc::rcorr(as.matrix(eyeperf_hearing_fw))$P
                       aoasl      signyrs     selfrate lex_forward eyes_forward mouth_forward
aoasl                     NA 7.205586e-01 9.499685e-01  0.68606718 1.481267e-01  4.162838e-01
signyrs           0.72055862           NA 5.732124e-05  0.22845065 5.467283e-01  7.644726e-01
selfrate          0.94996853 5.732124e-05           NA  0.02337677 9.881757e-01  8.693499e-01
lex_forward       0.68606718 2.284506e-01 2.337677e-02          NA 3.446869e-01  8.394476e-01
eyes_forward      0.14812668 5.467283e-01 9.881757e-01  0.34468693           NA  2.859607e-05
mouth_forward     0.41628381 7.644726e-01 8.693499e-01  0.83944758 2.859607e-05            NA
neck_forward      0.07033578 2.579308e-01 5.364661e-01  0.08632257 6.807338e-03  7.135195e-01
facechest_forward 0.18102107 1.615537e-01 9.358722e-01  0.19514544 8.849713e-03  5.100229e-01
                  neck_forward facechest_forward
aoasl             7.033578e-02      1.810211e-01
signyrs           2.579308e-01      1.615537e-01
selfrate          5.364661e-01      9.358722e-01
lex_forward       8.632257e-02      1.951454e-01
eyes_forward      6.807338e-03      8.849713e-03
mouth_forward     7.135195e-01      5.100229e-01
neck_forward                NA      1.861311e-11
facechest_forward 1.861311e-11                NA
cat(paste("","\n",""))
corstarsl(eyeperf_hearing_fw)

Hearing Correlations, Reversed

# Correlations for Hearing
print("HEARING Correlations - Pearson's r")
[1] "HEARING Correlations - Pearson's r"
#corstarsl(lexgist_hearing)
Hmisc::rcorr(as.matrix(eyeperf_hearing_rv))$r
                         aoasl     signyrs    selfrate gist_reversed lex_reversed eyes_reversed
aoasl               1.00000000 -0.07887013  0.01385561   0.078157514   0.06994864  -0.234574154
signyrs            -0.07887013  1.00000000  0.73847854   0.288457483   0.22209269   0.306984037
selfrate            0.01385561  0.73847854  1.00000000   0.521440804   0.36876982   0.192505553
gist_reversed       0.07815751  0.28845748  0.52144080   1.000000000   0.61989301  -0.003896097
lex_reversed        0.06994864  0.22209269  0.36876982   0.619893014   1.00000000  -0.128554240
eyes_reversed      -0.23457415  0.30698404  0.19250555  -0.003896097  -0.12855424   1.000000000
mouth_reversed      0.06256448  0.04730904 -0.11038394  -0.057827983   0.01769962  -0.608459473
neck_reversed       0.29446188 -0.38249552 -0.08287912   0.223993644   0.24863580  -0.667670012
facechest_reversed -0.20474470  0.43157929  0.15951976  -0.163039193  -0.19097045   0.602644563
                   mouth_reversed neck_reversed facechest_reversed
aoasl                  0.06256448    0.29446188         -0.2047447
signyrs                0.04730904   -0.38249552          0.4315793
selfrate              -0.11038394   -0.08287912          0.1595198
gist_reversed         -0.05782798    0.22399364         -0.1630392
lex_reversed           0.01769962    0.24863580         -0.1909705
eyes_reversed         -0.60845947   -0.66767001          0.6026446
mouth_reversed         1.00000000   -0.09060995          0.2372879
neck_reversed         -0.09060995    1.00000000         -0.9351352
facechest_reversed     0.23728788   -0.93513525          1.0000000
print("HEARING Correlations - P-values")
[1] "HEARING Correlations - P-values"
Hmisc::rcorr(as.matrix(eyeperf_hearing_rv))$P
                       aoasl      signyrs     selfrate gist_reversed lex_reversed eyes_reversed
aoasl                     NA 7.205586e-01 9.499685e-01   0.722986497  0.751135086  0.2813176741
signyrs            0.7205586           NA 5.732124e-05   0.181932462  0.308433949  0.1542103716
selfrate           0.9499685 5.732124e-05           NA   0.010720157  0.083351359  0.3788529812
gist_reversed      0.7229865 1.819325e-01 1.072016e-02            NA  0.001604978  0.9859236392
lex_reversed       0.7511351 3.084339e-01 8.335136e-02   0.001604978           NA  0.5588319622
eyes_reversed      0.2813177 1.542104e-01 3.788530e-01   0.985923639  0.558831962            NA
mouth_reversed     0.7767217 8.302717e-01 6.160912e-01   0.793254811  0.936112687  0.0020651940
neck_reversed      0.1725980 7.165620e-02 7.069493e-01   0.304204139  0.252624987  0.0004996113
facechest_reversed 0.3486849 3.975328e-02 4.671999e-01   0.457300336  0.382738792  0.0023393015
                   mouth_reversed neck_reversed facechest_reversed
aoasl                 0.776721725  1.725980e-01       3.486849e-01
signyrs               0.830271706  7.165620e-02       3.975328e-02
selfrate              0.616091213  7.069493e-01       4.671999e-01
gist_reversed         0.793254811  3.042041e-01       4.573003e-01
lex_reversed          0.936112687  2.526250e-01       3.827388e-01
eyes_reversed         0.002065194  4.996113e-04       2.339301e-03
mouth_reversed                 NA  6.809521e-01       2.756272e-01
neck_reversed         0.680952065            NA       6.290368e-11
facechest_reversed    0.275627154  6.290368e-11                 NA
cat(paste("","\n",""))
corstarsl(eyeperf_hearing_rv)

All People Correlations, Forward

eyeperf_fwrv <- fulldata %>%
  filter(eye_exclude == FALSE) %>%
  select(participant, maingroup, hearing, direction, aoasl, signyrs, selfrate, acc, gist, eyes, mouth, neck, facechest) %>%
  group_by(maingroup, participant, direction) %>%
  mutate(gist = mean(gist, na.rm = TRUE),
         lex = mean(acc, na.rm = TRUE),
         eyes = mean(eyes, na.rm = TRUE),
         mouth = mean(mouth, na.rm = TRUE),
         neck = mean(neck, na.rm = TRUE),
         facechest = mean(facechest, na.rm = TRUE)) %>%
  ungroup() %>%
  select(maingroup, participant, hearing, direction, aoasl, signyrs, selfrate, gist, lex, eyes, mouth, neck, facechest) %>%
  distinct() %>%
  gather(metric, value, gist:facechest) %>%
  unite(metricvalue, c(metric, direction), sep = "_", remove = FALSE) %>%
  select(-metric) %>%
  spread(metricvalue, value) %>%
  select(-participant, -maingroup, -hearing) %>%
  select(direction, aoasl, signyrs, selfrate, gist_reversed, lex_forward, lex_reversed, eyes_forward, eyes_reversed,
         mouth_forward, mouth_reversed, neck_forward, neck_reversed, facechest_forward, facechest_reversed)
Grouping rowwise data frame strips rowwise nature
eyeperf_fw <- eyeperf_fwrv %>% filter(direction == "forward") %>% 
  select(-direction, -gist_reversed, -lex_reversed, -eyes_reversed, -mouth_reversed, -neck_reversed, -facechest_reversed)
eyeperf_rv <- eyeperf_fwrv %>% filter(direction == "reversed") %>% select(-direction, -lex_forward, -eyes_forward, -mouth_forward, -neck_forward, -facechest_forward)
# Correlations for FW
print("FW Correlations - Pearson's r")
[1] "FW Correlations - Pearson's r"
#corstarsl(lexgist_deaf)
Hmisc::rcorr(as.matrix(eyeperf_fw))$r
                        aoasl     signyrs      selfrate lex_forward eyes_forward mouth_forward
aoasl              1.00000000 -0.78522450 -0.5061627626 -0.14263168    0.1023350    -0.0600452
signyrs           -0.78522450  1.00000000  0.7095934153  0.36334717   -0.0971436     0.2172435
selfrate          -0.50616276  0.70959342  1.0000000000  0.46112436   -0.1184349     0.1191126
lex_forward       -0.14263168  0.36334717  0.4611243606  1.00000000   -0.1346806     0.1166878
eyes_forward       0.10233497 -0.09714360 -0.1184348539 -0.13468060    1.0000000    -0.6230710
mouth_forward     -0.06004520  0.21724346  0.1191126406  0.11668780   -0.6230710     1.0000000
neck_forward      -0.12643635 -0.03886278  0.0937957317  0.05166910   -0.4273281    -0.4048121
facechest_forward  0.06745102  0.12098147 -0.0001684658 -0.03165489    0.4281833     0.4368729
                  neck_forward facechest_forward
aoasl              -0.12643635      0.0674510226
signyrs            -0.03886278      0.1209814698
selfrate            0.09379573     -0.0001684658
lex_forward         0.05166910     -0.0316548944
eyes_forward       -0.42732805      0.4281833172
mouth_forward      -0.40481210      0.4368729293
neck_forward        1.00000000     -0.9653760791
facechest_forward  -0.96537608      1.0000000000
print("FW Correlations - P-values")
[1] "FW Correlations - P-values"
Hmisc::rcorr(as.matrix(eyeperf_fw))$P
                         aoasl      signyrs     selfrate  lex_forward eyes_forward mouth_forward
aoasl                       NA 5.523138e-12 1.290503e-04 0.3131194667 4.703512e-01  6.724059e-01
signyrs           5.523138e-12           NA 3.880305e-09 0.0081064919 4.932766e-01  1.218575e-01
selfrate          1.290503e-04 3.880305e-09           NA 0.0005807587 4.030234e-01  4.003178e-01
lex_forward       3.131195e-01 8.106492e-03 5.807587e-04           NA 3.411308e-01  4.100460e-01
eyes_forward      4.703512e-01 4.932766e-01 4.030234e-01 0.3411308211           NA  8.097570e-07
mouth_forward     6.724059e-01 1.218575e-01 4.003178e-01 0.4100460282 8.097570e-07            NA
neck_forward      3.717642e-01 7.844425e-01 5.083628e-01 0.7160245249 1.579676e-03  2.913237e-03
facechest_forward 6.347056e-01 3.929129e-01 9.990543e-01 0.8237117786 1.542092e-03  1.203117e-03
                  neck_forward facechest_forward
aoasl              0.371764160       0.634705621
signyrs            0.784442500       0.392912923
selfrate           0.508362772       0.999054274
lex_forward        0.716024525       0.823711779
eyes_forward       0.001579676       0.001542092
mouth_forward      0.002913237       0.001203117
neck_forward                NA       0.000000000
facechest_forward  0.000000000                NA
cat(paste("","\n",""))
corstarsl(eyeperf_fw)

All People Correlations, Reversed

# Correlations for RV
print("RV Correlations - Pearson's r")
[1] "RV Correlations - Pearson's r"
#corstarsl(lexgist_hearing)
Hmisc::rcorr(as.matrix(eyeperf_rv))$r
                         aoasl     signyrs    selfrate gist_reversed lex_reversed eyes_reversed
aoasl               1.00000000 -0.78501874 -0.50422978 -0.3232638240  -0.25779733    0.08366051
signyrs            -0.78501874  1.00000000  0.70727050  0.2341087610   0.24984565   -0.02729736
selfrate           -0.50422978  0.70727050  1.00000000  0.3761505187   0.35782853    0.01126565
gist_reversed      -0.32326382  0.23410876  0.37615052  1.0000000000   0.44831455   -0.03314746
lex_reversed       -0.25779733  0.24984565  0.35782853  0.4483145475   1.00000000   -0.14027905
eyes_reversed       0.08366051 -0.02729736  0.01126565 -0.0331474617  -0.14027905    1.00000000
mouth_reversed     -0.08601686  0.25058311  0.13689724  0.1034677997   0.14056188   -0.54427344
neck_reversed      -0.09436191 -0.11454841 -0.05930558 -0.0002581948   0.07954131   -0.50321871
facechest_reversed -0.00671559  0.23324074  0.17394754  0.0425947122  -0.02840233    0.48223892
                   mouth_reversed neck_reversed facechest_reversed
aoasl                 -0.08601686 -0.0943619087        -0.00671559
signyrs                0.25058311 -0.1145484149         0.23324074
selfrate               0.13689724 -0.0593055785         0.17394754
gist_reversed          0.10346780 -0.0002581948         0.04259471
lex_reversed           0.14056188  0.0795413107        -0.02840233
eyes_reversed         -0.54427344 -0.5032187104         0.48223892
mouth_reversed         1.00000000 -0.3897527158         0.45460728
neck_reversed         -0.38975272  1.0000000000        -0.95769274
facechest_reversed     0.45460728 -0.9576927423         1.00000000
print("RV Correlations - P-values")
[1] "RV Correlations - P-values"
Hmisc::rcorr(as.matrix(eyeperf_rv))$P
                          aoasl      signyrs     selfrate gist_reversed lex_reversed eyes_reversed
aoasl                        NA 9.197088e-12 1.615663e-04  0.0206764715 0.0677889791  5.594433e-01
signyrs            9.197088e-12           NA 6.557459e-09  0.0982310781 0.0770305388  8.491958e-01
selfrate           1.615663e-04 6.557459e-09           NA  0.0065211917 0.0099363432  9.374616e-01
gist_reversed      2.067647e-02 9.823108e-02 6.521192e-03            NA 0.0009694904  8.173808e-01
lex_reversed       6.778898e-02 7.703054e-02 9.936343e-03  0.0009694904           NA  3.261871e-01
eyes_reversed      5.594433e-01 8.491958e-01 9.374616e-01  0.8173807987 0.3261870511            NA
mouth_reversed     5.483940e-01 7.613369e-02 3.381006e-01  0.4699673532 0.3252028385  3.651371e-05
neck_reversed      5.101240e-01 4.234798e-01 6.793202e-01  0.9985652716 0.5790064531  1.673548e-04
facechest_reversed 9.626962e-01 9.952016e-02 2.221732e-01  0.7666339865 0.8431666495  3.391156e-04
                   mouth_reversed neck_reversed facechest_reversed
aoasl                5.483940e-01  0.5101239971       0.9626961855
signyrs              7.613369e-02  0.4234797695       0.0995201557
selfrate             3.381006e-01  0.6793201518       0.2221731526
gist_reversed        4.699674e-01  0.9985652716       0.7666339865
lex_reversed         3.252028e-01  0.5790064531       0.8431666495
eyes_reversed        3.651371e-05  0.0001673548       0.0003391156
mouth_reversed                 NA  0.0046967186       0.0008043284
neck_reversed        4.696719e-03            NA       0.0000000000
facechest_reversed   8.043284e-04  0.0000000000                 NA
cat(paste("","\n",""))
corstarsl(eyeperf_rv)

Correlation Table

And the correlation table.

ggpairs(eyeperf, columns = c(2:13), aes(color = hearing))

 plot: [1,1] [=---------------------------------------------------------------------------]  1% est: 0s 
 plot: [1,2] [=---------------------------------------------------------------------------]  1% est:16s 
 plot: [1,3] [==--------------------------------------------------------------------------]  2% est:16s 
 plot: [1,4] [==--------------------------------------------------------------------------]  3% est:16s 
 plot: [1,5] [===-------------------------------------------------------------------------]  3% est:16s 
 plot: [1,6] [===-------------------------------------------------------------------------]  4% est:17s 
 plot: [1,7] [====------------------------------------------------------------------------]  5% est:17s 
 plot: [1,8] [====------------------------------------------------------------------------]  6% est:17s 
 plot: [1,9] [=====-----------------------------------------------------------------------]  6% est:16s 
 plot: [1,10] [=====----------------------------------------------------------------------]  7% est:16s 
 plot: [1,11] [======---------------------------------------------------------------------]  8% est:16s 
 plot: [1,12] [======---------------------------------------------------------------------]  8% est:15s 
 plot: [2,1] [=======---------------------------------------------------------------------]  9% est:15s 
 plot: [2,2] [=======---------------------------------------------------------------------] 10% est:15s 
 plot: [2,3] [========--------------------------------------------------------------------] 10% est:15s 
 plot: [2,4] [========--------------------------------------------------------------------] 11% est:15s 
 plot: [2,5] [=========-------------------------------------------------------------------] 12% est:15s 
 plot: [2,6] [==========------------------------------------------------------------------] 12% est:15s 
 plot: [2,7] [==========------------------------------------------------------------------] 13% est:14s 
 plot: [2,8] [===========-----------------------------------------------------------------] 14% est:14s 
 plot: [2,9] [===========-----------------------------------------------------------------] 15% est:14s 
 plot: [2,10] [===========----------------------------------------------------------------] 15% est:14s 
 plot: [2,11] [============---------------------------------------------------------------] 16% est:14s 
 plot: [2,12] [============---------------------------------------------------------------] 17% est:13s 
 plot: [3,1] [=============---------------------------------------------------------------] 17% est:13s 
 plot: [3,2] [==============--------------------------------------------------------------] 18% est:13s 
 plot: [3,3] [==============--------------------------------------------------------------] 19% est:13s 
 plot: [3,4] [===============-------------------------------------------------------------] 19% est:13s 
 plot: [3,5] [===============-------------------------------------------------------------] 20% est:13s 
 plot: [3,6] [================------------------------------------------------------------] 21% est:13s 
 plot: [3,7] [================------------------------------------------------------------] 22% est:13s 
 plot: [3,8] [=================-----------------------------------------------------------] 22% est:13s 
 plot: [3,9] [=================-----------------------------------------------------------] 23% est:13s 
 plot: [3,10] [==================---------------------------------------------------------] 24% est:12s 
 plot: [3,11] [==================---------------------------------------------------------] 24% est:12s 
 plot: [3,12] [===================--------------------------------------------------------] 25% est:12s 
 plot: [4,1] [====================--------------------------------------------------------] 26% est:12s 
 plot: [4,2] [====================--------------------------------------------------------] 26% est:12s 
 plot: [4,3] [=====================-------------------------------------------------------] 27% est:12s 
 plot: [4,4] [=====================-------------------------------------------------------] 28% est:12s 
 plot: [4,5] [======================------------------------------------------------------] 28% est:12s 
 plot: [4,6] [======================------------------------------------------------------] 29% est:12s 
 plot: [4,7] [=======================-----------------------------------------------------] 30% est:12s 
 plot: [4,8] [=======================-----------------------------------------------------] 31% est:12s 
 plot: [4,9] [========================----------------------------------------------------] 31% est:12s 
 plot: [4,10] [========================---------------------------------------------------] 32% est:11s 
 plot: [4,11] [========================---------------------------------------------------] 33% est:11s 
 plot: [4,12] [=========================--------------------------------------------------] 33% est:11s 
 plot: [5,1] [==========================--------------------------------------------------] 34% est:11s 
 plot: [5,2] [==========================--------------------------------------------------] 35% est:11s 
 plot: [5,3] [===========================-------------------------------------------------] 35% est:11s 
 plot: [5,4] [===========================-------------------------------------------------] 36% est:11s 
 plot: [5,5] [============================------------------------------------------------] 37% est:11s 
 plot: [5,6] [============================------------------------------------------------] 38% est:11s 
 plot: [5,7] [=============================-----------------------------------------------] 38% est:11s 
 plot: [5,8] [==============================----------------------------------------------] 39% est:11s 
 plot: [5,9] [==============================----------------------------------------------] 40% est:10s 
 plot: [5,10] [==============================---------------------------------------------] 40% est:10s 
 plot: [5,11] [===============================--------------------------------------------] 41% est:10s 
 plot: [5,12] [===============================--------------------------------------------] 42% est:10s 
 plot: [6,1] [================================--------------------------------------------] 42% est:10s 
 plot: [6,2] [=================================-------------------------------------------] 43% est:10s 
 plot: [6,3] [=================================-------------------------------------------] 44% est:10s 
 plot: [6,4] [==================================------------------------------------------] 44% est:10s 
 plot: [6,5] [==================================------------------------------------------] 45% est:10s 
 plot: [6,6] [===================================-----------------------------------------] 46% est:10s 
 plot: [6,7] [===================================-----------------------------------------] 47% est: 9s 
 plot: [6,8] [====================================----------------------------------------] 47% est: 9s 
 plot: [6,9] [====================================----------------------------------------] 48% est: 9s 
 plot: [6,10] [====================================---------------------------------------] 49% est: 9s 
 plot: [6,11] [=====================================--------------------------------------] 49% est: 9s 
 plot: [6,12] [======================================-------------------------------------] 50% est: 9s 
 plot: [7,1] [=======================================-------------------------------------] 51% est: 9s 
 plot: [7,2] [=======================================-------------------------------------] 51% est: 9s 
 plot: [7,3] [========================================------------------------------------] 52% est: 8s 
 plot: [7,4] [========================================------------------------------------] 53% est: 8s 
 plot: [7,5] [=========================================-----------------------------------] 53% est: 8s 
 plot: [7,6] [=========================================-----------------------------------] 54% est: 8s 
 plot: [7,7] [==========================================----------------------------------] 55% est: 8s 
 plot: [7,8] [==========================================----------------------------------] 56% est: 8s 
 plot: [7,9] [===========================================---------------------------------] 56% est: 8s 
 plot: [7,10] [===========================================--------------------------------] 57% est: 8s 
 plot: [7,11] [===========================================--------------------------------] 58% est: 8s 
 plot: [7,12] [============================================-------------------------------] 58% est: 7s 
 plot: [8,1] [=============================================-------------------------------] 59% est: 7s 
 plot: [8,2] [=============================================-------------------------------] 60% est: 7s 
 plot: [8,3] [==============================================------------------------------] 60% est: 7s 
 plot: [8,4] [==============================================------------------------------] 61% est: 7s 
 plot: [8,5] [===============================================-----------------------------] 62% est: 7s 
 plot: [8,6] [================================================----------------------------] 62% est: 7s 
 plot: [8,7] [================================================----------------------------] 63% est: 7s 
 plot: [8,8] [=================================================---------------------------] 64% est: 7s 
 plot: [8,9] [=================================================---------------------------] 65% est: 6s 
 plot: [8,10] [=================================================--------------------------] 65% est: 6s 
 plot: [8,11] [=================================================--------------------------] 66% est: 6s 
 plot: [8,12] [==================================================-------------------------] 67% est: 6s 
 plot: [9,1] [===================================================-------------------------] 67% est: 6s 
 plot: [9,2] [====================================================------------------------] 68% est: 6s 
 plot: [9,3] [====================================================------------------------] 69% est: 6s 
 plot: [9,4] [=====================================================-----------------------] 69% est: 6s 
 plot: [9,5] [=====================================================-----------------------] 70% est: 5s 
 plot: [9,6] [======================================================----------------------] 71% est: 5s 
 plot: [9,7] [======================================================----------------------] 72% est: 5s 
 plot: [9,8] [=======================================================---------------------] 72% est: 5s 
 plot: [9,9] [=======================================================---------------------] 73% est: 5s 
 plot: [9,10] [=======================================================--------------------] 74% est: 5s 
 plot: [9,11] [========================================================-------------------] 74% est: 5s 
 plot: [9,12] [========================================================-------------------] 75% est: 5s 
 plot: [10,1] [=========================================================------------------] 76% est: 4s 
 plot: [10,2] [=========================================================------------------] 76% est: 4s 
 plot: [10,3] [==========================================================-----------------] 77% est: 4s 
 plot: [10,4] [==========================================================-----------------] 78% est: 4s 
 plot: [10,5] [===========================================================----------------] 78% est: 4s 
 plot: [10,6] [===========================================================----------------] 79% est: 4s 
 plot: [10,7] [============================================================---------------] 80% est: 4s 
 plot: [10,8] [============================================================---------------] 81% est: 4s 
 plot: [10,9] [=============================================================--------------] 81% est: 4s 
 plot: [10,10] [=============================================================-------------] 82% est: 3s 
 plot: [10,11] [=============================================================-------------] 83% est: 3s 
 plot: [10,12] [==============================================================------------] 83% est: 3s 
 plot: [11,1] [===============================================================------------] 84% est: 3s 
 plot: [11,2] [================================================================-----------] 85% est: 3s 
 plot: [11,3] [================================================================-----------] 85% est: 3s 
 plot: [11,4] [=================================================================----------] 86% est: 3s 
 plot: [11,5] [=================================================================----------] 87% est: 2s 
 plot: [11,6] [==================================================================---------] 88% est: 2s 
 plot: [11,7] [==================================================================---------] 88% est: 2s 
 plot: [11,8] [===================================================================--------] 89% est: 2s 
 plot: [11,9] [===================================================================--------] 90% est: 2s 
 plot: [11,10] [===================================================================-------] 90% est: 2s 
 plot: [11,11] [===================================================================-------] 91% est: 2s 
 plot: [11,12] [====================================================================------] 92% est: 2s 
 plot: [12,1] [=====================================================================------] 92% est: 1s 
 plot: [12,2] [======================================================================-----] 93% est: 1s 
 plot: [12,3] [======================================================================-----] 94% est: 1s 
 plot: [12,4] [=======================================================================----] 94% est: 1s 
 plot: [12,5] [=======================================================================----] 95% est: 1s 
 plot: [12,6] [========================================================================---] 96% est: 1s 
 plot: [12,7] [========================================================================---] 97% est: 1s 
 plot: [12,8] [=========================================================================--] 97% est: 1s 
 plot: [12,9] [=========================================================================--] 98% est: 0s 
 plot: [12,10] [=========================================================================-] 99% est: 0s 
 plot: [12,11] [=========================================================================-] 99% est: 0s 
 plot: [12,12] [==========================================================================]100% est: 0s 
                                                                                                        

Heat Maps

And finally, we’re going to do heat maps.

eyegaze_heat <- fulldata %>%
  ungroup() %>%
  filter(eye_exclude == FALSE) %>%
  select(id:direction, belly, lowerchest, midchest, upperchest, neck, mouth, eyes, forehead) %>%
  gather(aoi, percent, belly:forehead) %>%
  group_by(maingroup, participant, direction, aoi) %>%
  summarise(percent = mean(percent, na.rm=TRUE)) %>%
  group_by(maingroup,direction,aoi) %>%
  summarise(percent = mean(percent, na.rm=TRUE)) %>%
  ungroup() %>%
  filter(!is.na(aoi)) %>%
  mutate(aoi = factor(aoi,levels=c("belly","lowerchest","midchest",
                                   "upperchest","neck","mouth","eyes","forehead"))) %>%
  ungroup() %>%
  mutate(maingroup = case_when(
    maingroup == "DeafEarly" ~ "Deaf Early",
    maingroup == "DeafLate" ~ "Deaf Late",
    maingroup == "HearingLate" ~ "Hearing Late",
    maingroup == "HearingNovice" ~ "Hearing Novice"
    ))
eyegaze_heat_all <- fulldata %>%
  ungroup() %>%
  filter(eye_exclude == FALSE) %>%
  select(id:direction, belly, lowerchest, midchest, upperchest, neck, mouth, eyes, forehead) %>%
  gather(aoi, percent, belly:forehead) %>%
  group_by(maingroup,participant,direction,aoi) %>%
  dplyr::summarize(percent = mean(percent, na.rm=TRUE)) %>%
  group_by(maingroup,direction,aoi) %>%
  dplyr::summarize(percent = mean(percent, na.rm=TRUE)) %>%
  group_by(maingroup,aoi) %>%
  dplyr::summarize(percent = mean(percent, na.rm=TRUE)) %>%
  ungroup() %>%
  filter(!is.na(aoi)) %>%
  mutate(aoi = factor(aoi,levels=c("belly","lowerchest","midchest",
                                   "upperchest","neck","mouth","eyes","forehead"))) %>%
  ungroup() %>%
  mutate(maingroup = case_when(
    maingroup == "DeafEarly" ~ "Deaf Early",
    maingroup == "DeafLate" ~ "Deaf Late",
    maingroup == "HearingLate" ~ "Hearing Late",
    maingroup == "HearingNovice" ~ "Hearing Novice"
    ))
ggplot(eyegaze_heat, aes(x = maingroup, y = aoi)) +
  geom_tile(aes(fill=percent),color="lightgray",na.rm=TRUE) + 
  scale_fill_viridis(option = "viridis", direction=-1, limits = c(0,.71), labels = percent, name = "looking time") +
  theme_bw() +
  theme(axis.text.x=element_text(angle=30,hjust=1),
        strip.text.x = element_text(size = 11, color = "black", face = "italic"), 
        strip.background = element_rect(colour = "white", fill = "white"),
        panel.grid.major = element_line(color = "white")) +
  facet_grid(. ~ direction) +
  ylab("") + xlab("") + ggtitle("Eye Gaze Heat Map, by Direction") + 
  scale_y_discrete(expand=c(0,0)) +
  scale_x_discrete(expand = c(0,0))

ggplot(eyegaze_heat_all, aes(x = maingroup, y = aoi)) +
  geom_tile(aes(fill=percent),color="lightgray",na.rm=TRUE) + 
  scale_fill_viridis(option = "viridis", direction=-1, limits = c(0,.71), labels = percent, name = "looking time") +
  theme_bw() +
  theme(axis.text.x=element_text(angle=30,hjust=1), 
  panel.grid.major = element_line(color = "white")) +
  ylab("") + xlab("") + ggtitle("Eye Gaze Heat Map (Direction Collapsed)") +
  scale_y_discrete(expand=c(0,0)) +
  scale_x_discrete(expand = c(0,0))

Summary

Below are the p-values from the ANOVAs with 4 MainGroups. I never included Age as a covariate because it never improved the model. I included all ANOVAs for Gist and Lex Recall, and ANOVAs for any eye AOI or ratio was included only if either maingroup or direction was significant. Deafearly-Deaflate shows the LSD p-value for that comparison.

results1 <- structure(list(model = c("gist-maingroup-both", "gist-maingroup-fw", 
"gist-maingroup-rv", "lexrecall-maingroup-both", "lexrecall-maingroup-fw", 
"lexrecall-maingroup-rv", "mouth-maingroup-both", "upperchest-maingroup-both", 
"upperchest-maingroup-rv", "facechest-maingroup-both", "moutheye-maingroup-both"
), maingroup = c(0, 0, 0.01, 0, 0.04, 0.02, 0.06, 0, 0.01, 0.1, 
0.05), direction = c(0, NA, NA, 0, NA, NA, 0.06, 0.16, NA, 0.07, 
0.48), `deafearly-deaflate` = c(0.1, 0.69, 0.02, 0.11, 0.95, 
0.06, 0.38, 0.94, 0.52, 0.08, 0.68)), .Names = c("model", "maingroup", 
"direction", "deafearly-deaflate"), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -11L))
results1

And below are the p-values from the ANCOVAs with Hearing & AoASL. I included all ANCOVAs for Gist and Lex Recall, and ANCOVAs for any eye AOI or ratio was included only if any main factor was significant. LSD comparisons are not needed because there’s only 2 levels in each group!

results2 <- structure(list(model = c("gist-both", "gist-fw", "gist-rv", "lex-both", 
"lex-fw", "lex-rv", "forehead-fw", "mouth-both", "mouth-rv", 
"upperchest-both", "upperchest-rv", "facechest-both", "moutheye-both"
), hearing = c(0, 0.00, 0.01, 0.01, 0.22, 0.03, 0.06, 0.01, 
0.04, 0.01, 0.01, 0.35, 0.07), direction = c(0, NA, NA, 0, NA, 
NA, NA, 0.05, NA, 0.21, NA, 0.05, 0.52), aoasl = c(0.22, 0.77, 
0.19, 0.56, 0.58, 0.25, 0.08, 0.06, 0.12, 0.68, 0.95, 0.12, 0.44
), age = c(0.08, 0.01, 0.86, 0.09, 0.02, 0.7, 0.68, 0.28, 0.5, 
0.02, 0.08, 0.00, 0.21)), .Names = c("model", "hearing", "direction", 
"aoasl", "age"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-13L))
results2

Finally, the correlations for Deaf and Hearing separately are not significant. But there are significant correlations across all participants. I worry it is caused by HearingNovice, though…

results3 <- tribble(
  ~ metric, ~ AoASLcorrelationRvalue, ~ Pvalue,
  "gist-fw", -0.32, 0.019,
  "gist-rv", -0.39, 0.004,
  "lex-fw", -0.08, 0.567,
  "lex-rv", -0.34, 0.014
)
results3

Ternary Plots

Let’s make triangle plots. “What?” you say. Read on.

library(ggtern)
fulldata %>% 
  ggtern(aes(x = eyes, y = mouth, z = neck)) + facet_grid(direction ~ maingroup) + stat_density_tern(geom='polygon', aes(fill=..level..), bins=4) + geom_point(color = "white", alpha = 0.5) + theme_bw()

fulldata %>% 
  ggtern(aes(x = eyes, y = mouth, z = neck)) + facet_grid(direction ~ maingroup) + geom_confidence_tern(breaks = c(.5), color = "red") + geom_point() + theme_bw()

Rain’s Notes

About Adults:

-I think I want to write it up as an ANCOVA, with direction included. And LSD comparisons instead of Tukey. (I will do my own corrections) -You often have one liners summarizing results, in all tabs, those are nice, keep them coming. -(If you have reasons to present anything other than the ANCOVA, put that in your results tab)

I think if we do it this way then we get a really important story to tell: That the critical AoA cutoff is below 4 vs above 4 years of age (two groups 0-4 vs 4-13). This suggest early ASL is important.

Viewing Space Correlations

Okay now let’s work with the raw viewing space that we created in 05viewingspace. For each participant the first 30 samples was removed.

  • box width
  • upper limit
  • lower limit
  • left side
  • right side
  • height
  • box center position
  • area

correlated with

  • gist
  • lexical recall
  • sign years
  • aoasl

Here’s sample of the raw viewing data structure. I’m also going to fix participant names because the raw viewing data has the old participant names.

viewing <- read_csv('adultviewingspaceraw.csv', progress=FALSE) 
# Fix participant names
partnames <- read_csv("partnames.csv") %>% 
  distinct() %>% 
  mutate(participant = as.character(participant),
         new_participant = as.character(new_participant))
viewing <- left_join(viewing, partnames, by = "participant") %>%
  select(-participant) %>%
  rename(participant = new_participant) %>%
  filter(!is.na(participant)) %>%
  select(participant, group:maingroup)
# Show table
head(viewing, 10)

Now I’m going to compute the following metrics with the following definitions!

  • upper (75th percentile on y-axis)
  • lower (25th percentile on y-axis)
  • left (25th percentile on x-axis)
  • right (75th percentile on x-axis)
  • width (x-axis IQR)
  • height (y-axis IQR)
  • x-center (median x-axis)
  • y-center (median y-axis)
  • area (x-axis IQR * y-axis IQR)
# compute viewing metrics
viewing_metrics <- viewing %>%
  group_by(participant, direction, media) %>%
  summarise(
    upper = quantile(y,na.rm=TRUE)[[2]],
    lower = quantile(y,na.rm=TRUE)[[4]],
    left = quantile(x,na.rm=TRUE)[[2]],
    right = quantile(x,na.rm=TRUE)[[4]],
    width = IQR(x,na.rm=TRUE),
    height = IQR(y,na.rm=TRUE),
    x_center = median(x,na.rm=TRUE),
    y_center = median(y,na.rm=TRUE),
    area = width*height
    )
# average across two stories for each direction
viewing_metrics <- viewing_metrics %>%
  group_by(participant, direction) %>%
  summarise_if(is.numeric, funs(mean(., na.rm = TRUE)))
head(viewing_metrics,10)

Now I’ll join the behavioral data with the viewing space metrics. Below is an example of the forward table for viewing space and behavioral data

# Get behavioral measures
eyeperf_fwrv <- fulldata %>%
  filter(eye_exclude == FALSE) %>%
  select(participant, maingroup, hearing, direction, aoasl, signyrs, selfrate, acc, gist, eyes, mouth, neck, facechest) %>%
  group_by(maingroup, participant, direction) %>%
  mutate(gist = mean(gist, na.rm = TRUE),
         lex = mean(acc, na.rm = TRUE),
         eyes = mean(eyes, na.rm = TRUE),
         mouth = mean(mouth, na.rm = TRUE),
         neck = mean(neck, na.rm = TRUE),
         facechest = mean(facechest, na.rm = TRUE)) %>%
  ungroup() %>%
  select(maingroup, participant, hearing, direction, aoasl, signyrs, selfrate, gist, lex) %>%
  distinct()
viewing_metrics_behav <- 
  left_join(viewing_metrics, eyeperf_fwrv, by = c("participant","direction")) %>%
  filter(!is.na(maingroup)) %>%
  select(participant, direction, hearing, maingroup:lex, upper:area) %>%
  gather(metric, value, gist:area) %>%
  unite(metricvalue, c(metric, direction), sep = "_", remove = FALSE) %>%
  select(-metric) %>%
  spread(metricvalue, value) %>%
  ungroup() %>%
  select(-participant, -maingroup)
viewing_fw <- viewing_metrics_behav %>% 
  filter(direction == "forward") %>% 
  select(hearing,
         aoasl,
         signyrs,
         selfrate,
         gist_forward, 
         lex_forward, 
         upper_forward, 
         lower_forward, 
         left_forward, 
         right_forward, 
         width_forward, 
         height_forward, 
         x_center_forward, 
         y_center_forward,
         area_forward)
viewing_fw_deaf <- viewing_fw %>%
  filter(hearing == "Deaf") %>%
  select(-hearing)
viewing_fw_hearing <- viewing_fw %>%
  filter(hearing == "Hearing") %>%
  select(-hearing)
viewing_rv <- viewing_metrics_behav %>% 
  filter(direction == "reversed") %>% 
  select(hearing,
         aoasl,
         signyrs,
         selfrate,
         gist_reversed, 
         lex_reversed, 
         upper_reversed, 
         lower_reversed, 
         left_reversed, 
         right_reversed, 
         width_reversed, 
         height_reversed, 
         x_center_reversed, 
         y_center_reversed,
         area_reversed)
viewing_rv_deaf <- viewing_rv %>%
  filter(hearing == "Deaf") %>%
  select(-hearing)
viewing_rv_hearing <- viewing_rv %>%
  filter(hearing == "Hearing") %>%
  select(-hearing)
viewing_fw <- select(viewing_fw, -hearing)
viewing_rv <- select(viewing_rv, -hearing)
head(viewing_fw,10)

Deaf Viewing Correlations, Forward

print("Correlations - Pearson's r")
[1] "Correlations - Pearson's r"
Hmisc::rcorr(as.matrix(viewing_fw_deaf))$r
                       aoasl    signyrs selfrate gist_forward  lex_forward upper_forward lower_forward
aoasl             1.00000000 -0.5018827      NaN  0.082663715  0.117240317    0.22276899   0.177404076
signyrs          -0.50188273  1.0000000      NaN  0.183211267  0.385176599   -0.20595349  -0.148607492
selfrate                 NaN        NaN        1          NaN          NaN           NaN           NaN
gist_forward      0.08266371  0.1832113      NaN  1.000000000 -0.051814456    0.04457362  -0.009906705
lex_forward       0.11724032  0.3851766      NaN -0.051814456  1.000000000   -0.09693144  -0.065050073
upper_forward     0.22276899 -0.2059535      NaN  0.044573616 -0.096931443    1.00000000   0.933846593
lower_forward     0.17740408 -0.1486075      NaN -0.009906705 -0.065050073    0.93384659   1.000000000
left_forward     -0.16560842  0.3251682      NaN  0.319111466 -0.038623869    0.11382223   0.036799625
right_forward    -0.06149620  0.2908278      NaN  0.161788926  0.027752422    0.14657307   0.337579310
width_forward     0.03814862  0.1200164      NaN -0.023894681  0.057139564    0.09332054   0.362742156
height_forward   -0.10832062  0.1429820      NaN -0.147926822  0.080896251   -0.10393404   0.258678198
x_center_forward -0.03683807  0.2590204      NaN  0.188047156  0.007652872    0.21590504   0.362885207
y_center_forward  0.21023138 -0.1656808      NaN  0.006174181 -0.070294872    0.97119236   0.986980736
area_forward      0.03468568  0.1029605      NaN -0.009832729  0.066630222    0.11923245   0.402184755
                 left_forward right_forward width_forward height_forward x_center_forward
aoasl             -0.16560842   -0.06149620    0.03814862    -0.10832062     -0.036838066
signyrs            0.32516822    0.29082775    0.12001636     0.14298201      0.259020388
selfrate                  NaN           NaN           NaN            NaN              NaN
gist_forward       0.31911147    0.16178893   -0.02389468    -0.14792682      0.188047156
lex_forward       -0.03862387    0.02775242    0.05713956     0.08089625      0.007652872
upper_forward      0.11382223    0.14657307    0.09332054    -0.10393404      0.215905041
lower_forward      0.03679962    0.33757931    0.36274216     0.25867820      0.362885207
left_forward       1.00000000    0.49463212   -0.08905077    -0.20506901      0.605776429
right_forward      0.49463212    1.00000000    0.82160223     0.54286009      0.978675783
width_forward     -0.08905077    0.82160223    1.00000000     0.75664872      0.724262059
height_forward    -0.20506901    0.54286009    0.75664872     1.00000000      0.425984561
x_center_forward   0.60577643    0.97867578    0.72426206     0.42598456      1.000000000
y_center_forward   0.07188921    0.30117929    0.29801029     0.12161653      0.345480084
area_forward      -0.04656800    0.82760513    0.97901434     0.79634696      0.754101455
                 y_center_forward area_forward
aoasl                 0.210231379  0.034685675
signyrs              -0.165680766  0.102960534
selfrate                      NaN          NaN
gist_forward          0.006174181 -0.009832729
lex_forward          -0.070294872  0.066630222
upper_forward         0.971192360  0.119232446
lower_forward         0.986980736  0.402184755
left_forward          0.071889207 -0.046568003
right_forward         0.301179290  0.827605128
width_forward         0.298010290  0.979014337
height_forward        0.121616535  0.796346962
x_center_forward      0.345480084  0.754101455
y_center_forward      1.000000000  0.329823852
area_forward          0.329823852  1.000000000
print("Correlations - P-values")
[1] "Correlations - P-values"
Hmisc::rcorr(as.matrix(viewing_fw_deaf))$P
                       aoasl     signyrs selfrate gist_forward lex_forward upper_forward lower_forward
aoasl                     NA 0.005536857      NaN   0.66988388  0.54472632  2.454197e-01  3.572285e-01
signyrs          0.005536857          NA      NaN   0.34144730  0.03907663  2.837870e-01  4.416792e-01
selfrate                 NaN         NaN       NA          NaN         NaN           NaN           NaN
gist_forward     0.669883883 0.341447297      NaN           NA  0.78951935  8.184091e-01  9.593226e-01
lex_forward      0.544726321 0.039076627      NaN   0.78951935          NA  6.169262e-01  7.374352e-01
upper_forward    0.245419744 0.283787002      NaN   0.81840913  0.61692623            NA  1.425526e-13
lower_forward    0.357228511 0.441679211      NaN   0.95932259  0.73743520  1.425526e-13            NA
left_forward     0.390588593 0.085216835      NaN   0.09154228  0.84232480  5.565959e-01  8.496861e-01
right_forward    0.751319398 0.125876853      NaN   0.40176100  0.88636549  4.480250e-01  7.330173e-02
width_forward    0.844241358 0.535174493      NaN   0.90208021  0.76844359  6.301655e-01  5.311918e-02
height_forward   0.575946372 0.459344375      NaN   0.44379693  0.67655997  5.915861e-01  1.754355e-01
x_center_forward 0.849530895 0.174844803      NaN   0.32863242  0.96857176  2.606435e-01  5.301852e-02
y_center_forward 0.273682515 0.390378710      NaN   0.97464218  0.71709285  0.000000e+00  0.000000e+00
area_forward     0.858231981 0.595081836      NaN   0.95962610  0.73128747  5.378637e-01  3.055416e-02
                 left_forward right_forward width_forward height_forward x_center_forward
aoasl            0.3905885931  7.513194e-01  8.442414e-01   5.759464e-01     8.495309e-01
signyrs          0.0852168350  1.258769e-01  5.351745e-01   4.593444e-01     1.748448e-01
selfrate                  NaN           NaN           NaN            NaN              NaN
gist_forward     0.0915422821  4.017610e-01  9.020802e-01   4.437969e-01     3.286324e-01
lex_forward      0.8423247995  8.863655e-01  7.684436e-01   6.765600e-01     9.685718e-01
upper_forward    0.5565958651  4.480250e-01  6.301655e-01   5.915861e-01     2.606435e-01
lower_forward    0.8496861459  7.330173e-02  5.311918e-02   1.754355e-01     5.301852e-02
left_forward               NA  6.378305e-03  6.459661e-01   2.859055e-01     4.968572e-04
right_forward    0.0063783047            NA  4.682795e-08   2.343920e-03     0.000000e+00
width_forward    0.6459660795  4.682795e-08            NA   2.042502e-06     8.922432e-06
height_forward   0.2859055167  2.343920e-03  2.042502e-06             NA     2.121700e-02
x_center_forward 0.0004968572  0.000000e+00  8.922432e-06   2.121700e-02               NA
y_center_forward 0.7109456999  1.123599e-01  1.163778e-01   5.297050e-01     6.641454e-02
area_forward     0.8104269134  3.063746e-08  0.000000e+00   2.383185e-07     2.312127e-06
                 y_center_forward area_forward
aoasl                  0.27368252 8.582320e-01
signyrs                0.39037871 5.950818e-01
selfrate                      NaN          NaN
gist_forward           0.97464218 9.596261e-01
lex_forward            0.71709285 7.312875e-01
upper_forward          0.00000000 5.378637e-01
lower_forward          0.00000000 3.055416e-02
left_forward           0.71094570 8.104269e-01
right_forward          0.11235989 3.063746e-08
width_forward          0.11637777 0.000000e+00
height_forward         0.52970504 2.383185e-07
x_center_forward       0.06641454 2.312127e-06
y_center_forward               NA 8.058556e-02
area_forward           0.08058556           NA
corstarsl(viewing_fw_deaf)

Deaf Viewing Correlations, Reversed

print("Correlations - Pearson's r")
[1] "Correlations - Pearson's r"
Hmisc::rcorr(as.matrix(viewing_rv_deaf))$r
                         aoasl     signyrs selfrate gist_reversed lex_reversed upper_reversed
aoasl              1.000000000 -0.50300056      NaN  -0.226608574 -0.167800650    0.101951204
signyrs           -0.503000557  1.00000000      NaN  -0.106652059 -0.025210742   -0.086768545
selfrate                   NaN         NaN        1           NaN          NaN            NaN
gist_reversed     -0.226608574 -0.10665206      NaN   1.000000000  0.303169012   -0.335941106
lex_reversed      -0.167800650 -0.02521074      NaN   0.303169012  1.000000000    0.008202689
upper_reversed     0.101951204 -0.08676855      NaN  -0.335941106  0.008202689    1.000000000
lower_reversed     0.113063924 -0.10887118      NaN  -0.368524045 -0.121148907    0.961254358
left_reversed     -0.201770395  0.32283238      NaN   0.037616570 -0.163973972   -0.106090039
right_reversed    -0.231537044  0.37951201      NaN  -0.046700899 -0.266614407   -0.293614268
width_reversed    -0.043917120  0.08763168      NaN  -0.164183304 -0.186162397   -0.352755576
height_reversed    0.007116611 -0.04774316      NaN  -0.010148541 -0.428810000   -0.417272210
x_center_reversed -0.198076725  0.32655811      NaN   0.002943648 -0.208773434   -0.189508304
y_center_reversed  0.105498217 -0.08154444      NaN  -0.371637464 -0.049562834    0.993730366
area_reversed     -0.047446601  0.05434785      NaN  -0.145123839 -0.368637770   -0.377499104
                  lower_reversed left_reversed right_reversed width_reversed height_reversed
aoasl                  0.1130639   -0.20177040    -0.23153704    -0.04391712     0.007116611
signyrs               -0.1088712    0.32283238     0.37951201     0.08763168    -0.047743160
selfrate                     NaN           NaN            NaN            NaN             NaN
gist_reversed         -0.3685240    0.03761657    -0.04670090    -0.16418330    -0.010148541
lex_reversed          -0.1211489   -0.16397397    -0.26661441    -0.18616240    -0.428810000
upper_reversed         0.9612544   -0.10609004    -0.29361427    -0.35275558    -0.417272210
lower_reversed         1.0000000   -0.19918551    -0.33227807    -0.24227206    -0.150587291
left_reversed         -0.1991855    1.00000000     0.86912864    -0.31632864    -0.276191771
right_reversed        -0.3322781    0.86912864     1.00000000     0.19425865    -0.042450730
width_reversed        -0.2422721   -0.31632864     0.19425865     1.00000000     0.466368824
height_reversed       -0.1505873   -0.27619177    -0.04245073     0.46636882     1.000000000
x_center_reversed     -0.2613117    0.97342944     0.95038193    -0.10777984    -0.181845069
y_center_reversed      0.9812745   -0.13741530    -0.30074865    -0.30431005    -0.328786880
area_reversed         -0.1558549   -0.37452036     0.05324661     0.84494543     0.839997828
                  x_center_reversed y_center_reversed area_reversed
aoasl                  -0.198076725        0.10549822   -0.04744660
signyrs                 0.326558113       -0.08154444    0.05434785
selfrate                        NaN               NaN           NaN
gist_reversed           0.002943648       -0.37163746   -0.14512384
lex_reversed           -0.208773434       -0.04956283   -0.36863777
upper_reversed         -0.189508304        0.99373037   -0.37749910
lower_reversed         -0.261311710        0.98127455   -0.15585490
left_reversed           0.973429441       -0.13741530   -0.37452036
right_reversed          0.950381935       -0.30074865    0.05324661
width_reversed         -0.107779838       -0.30431005    0.84494543
height_reversed        -0.181845069       -0.32878688    0.83999783
x_center_reversed       1.000000000       -0.21177836   -0.20833784
y_center_reversed      -0.211778358        1.00000000   -0.29641837
area_reversed          -0.208337843       -0.29641837    1.00000000
print("Correlations - P-values")
[1] "Correlations - P-values"
Hmisc::rcorr(as.matrix(viewing_rv_deaf))$P
                        aoasl     signyrs selfrate gist_reversed lex_reversed upper_reversed
aoasl                      NA 0.006366983      NaN    0.24621482   0.39337596   6.056954e-01
signyrs           0.006366983          NA      NaN    0.58908365   0.89867088   6.606379e-01
selfrate                  NaN         NaN       NA           NaN          NaN            NaN
gist_reversed     0.246214823 0.589083649      NaN            NA   0.11682337   8.050046e-02
lex_reversed      0.393375956 0.898670879      NaN    0.11682337           NA   9.669561e-01
upper_reversed    0.605695394 0.660637899      NaN    0.08050046   0.96695611             NA
lower_reversed    0.566750829 0.581311185      NaN    0.05364705   0.53914849   4.440892e-16
left_reversed     0.303183928 0.093818320      NaN    0.84927772   0.40440777   5.910593e-01
right_reversed    0.235814231 0.046386370      NaN    0.81344835   0.17023652   1.293989e-01
width_reversed    0.824392288 0.657464308      NaN    0.40379983   0.34287809   6.559217e-02
height_reversed   0.971329380 0.809359569      NaN    0.95912323   0.02279454   2.715960e-02
x_center_reversed 0.312306771 0.089874980      NaN    0.98813896   0.28635018   3.341168e-01
y_center_reversed 0.593142708 0.679967030      NaN    0.05150478   0.80223279   0.000000e+00
area_reversed     0.810522474 0.783567330      NaN    0.46122802   0.05356759   4.765470e-02
                  lower_reversed left_reversed right_reversed width_reversed height_reversed
aoasl               5.667508e-01  3.031839e-01   2.358142e-01   8.243923e-01    9.713294e-01
signyrs             5.813112e-01  9.381832e-02   4.638637e-02   6.574643e-01    8.093596e-01
selfrate                     NaN           NaN            NaN            NaN             NaN
gist_reversed       5.364705e-02  8.492777e-01   8.134484e-01   4.037998e-01    9.591232e-01
lex_reversed        5.391485e-01  4.044078e-01   1.702365e-01   3.428781e-01    2.279454e-02
upper_reversed      4.440892e-16  5.910593e-01   1.293989e-01   6.559217e-02    2.715960e-02
lower_reversed                NA  3.095506e-01   8.406690e-02   2.141845e-01    4.443424e-01
left_reversed       3.095506e-01            NA   1.979650e-09   1.010128e-01    1.548274e-01
right_reversed      8.406690e-02  1.979650e-09             NA   3.219137e-01    8.301702e-01
width_reversed      2.141845e-01  1.010128e-01   3.219137e-01             NA    1.236432e-02
height_reversed     4.443424e-01  1.548274e-01   8.301702e-01   1.236432e-02              NA
x_center_reversed   1.792184e-01  0.000000e+00   1.065814e-14   5.851280e-01    3.543850e-01
y_center_reversed   0.000000e+00  4.856146e-01   1.199199e-01   1.153842e-01    8.757681e-02
area_reversed       4.283817e-01  4.958173e-02   7.878531e-01   1.554222e-08    2.269860e-08
                  x_center_reversed y_center_reversed area_reversed
aoasl                  3.123068e-01        0.59314271  8.105225e-01
signyrs                8.987498e-02        0.67996703  7.835673e-01
selfrate                        NaN               NaN           NaN
gist_reversed          9.881390e-01        0.05150478  4.612280e-01
lex_reversed           2.863502e-01        0.80223279  5.356759e-02
upper_reversed         3.341168e-01        0.00000000  4.765470e-02
lower_reversed         1.792184e-01        0.00000000  4.283817e-01
left_reversed          0.000000e+00        0.48561457  4.958173e-02
right_reversed         1.065814e-14        0.11991990  7.878531e-01
width_reversed         5.851280e-01        0.11538422  1.554222e-08
height_reversed        3.543850e-01        0.08757681  2.269860e-08
x_center_reversed                NA        0.27931293  2.873796e-01
y_center_reversed      2.793129e-01                NA  1.256101e-01
area_reversed          2.873796e-01        0.12561011            NA
corstarsl(viewing_rv_deaf)

Hearing Viewing Correlations, Forward

print("Correlations - Pearson's r")
[1] "Correlations - Pearson's r"
Hmisc::rcorr(as.matrix(viewing_fw_hearing))$r
                       aoasl     signyrs    selfrate gist_forward lex_forward upper_forward lower_forward
aoasl             1.00000000 -0.07887013  0.01385561  -0.15525565  0.08908092    0.34941310    0.20590344
signyrs          -0.07887013  1.00000000  0.73847854   0.57814670  0.26130641   -0.13453354   -0.22613998
selfrate          0.01385561  0.73847854  1.00000000   0.70963997  0.47076830   -0.13376451   -0.18677658
gist_forward     -0.15525565  0.57814670  0.70963997   1.00000000  0.52977526   -0.23917460   -0.28737646
lex_forward       0.08908092  0.26130641  0.47076830   0.52977526  1.00000000    0.05096587   -0.04066122
upper_forward     0.34941310 -0.13453354 -0.13376451  -0.23917460  0.05096587    1.00000000    0.81072843
lower_forward     0.20590344 -0.22613998 -0.18677658  -0.28737646 -0.04066122    0.81072843    1.00000000
left_forward     -0.05141619  0.08821356  0.36718413   0.28496009  0.51274025   -0.03738438   -0.35104996
right_forward    -0.21900962  0.11569295  0.41681939   0.33033866  0.52155632   -0.21593012   -0.33353657
width_forward    -0.36826536  0.05341980  0.07835181   0.07606009 -0.02513881   -0.39384943    0.06958863
height_forward   -0.18298261 -0.17758474 -0.11227107  -0.12206492 -0.14608788   -0.14968227    0.45747548
x_center_forward -0.11209472  0.04108265  0.38386798   0.27761868  0.48736075   -0.08373722   -0.29967061
y_center_forward  0.30487907 -0.19751061 -0.16246900  -0.25737920  0.02756594    0.97334260    0.91343915
area_forward     -0.34011137  0.06345770  0.05021929   0.03946279 -0.06444699   -0.33132094    0.22571172
                 left_forward right_forward width_forward height_forward x_center_forward
aoasl             -0.05141619   -0.21900962   -0.36826536    -0.18298261      -0.11209472
signyrs            0.08821356    0.11569295    0.05341980    -0.17758474       0.04108265
selfrate           0.36718413    0.41681939    0.07835181    -0.11227107       0.38386798
gist_forward       0.28496009    0.33033866    0.07606009    -0.12206492       0.27761868
lex_forward        0.51274025    0.52155632   -0.02513881    -0.14608788       0.48736075
upper_forward     -0.03738438   -0.21593012   -0.39384943    -0.14968227      -0.08373722
lower_forward     -0.35104996   -0.33353657    0.06958863     0.45747548      -0.29967061
left_forward       1.00000000    0.90348214   -0.30194035    -0.53611207       0.97660261
right_forward      0.90348214    1.00000000    0.13582274    -0.23533283       0.95313561
width_forward     -0.30194035    0.13582274    1.00000000     0.71576405      -0.13742264
height_forward    -0.53611207   -0.23533283    0.71576405     1.00000000      -0.37892902
x_center_forward   0.97660261    0.95313561   -0.13742264    -0.37892902       1.00000000
y_center_forward  -0.15817767   -0.26314104   -0.21964976     0.06427938      -0.16702029
area_forward      -0.48057628   -0.08236247    0.92762613     0.88446701      -0.32508183
                 y_center_forward area_forward
aoasl                  0.30487907  -0.34011137
signyrs               -0.19751061   0.06345770
selfrate              -0.16246900   0.05021929
gist_forward          -0.25737920   0.03946279
lex_forward            0.02756594  -0.06444699
upper_forward          0.97334260  -0.33132094
lower_forward          0.91343915   0.22571172
left_forward          -0.15817767  -0.48057628
right_forward         -0.26314104  -0.08236247
width_forward         -0.21964976   0.92762613
height_forward         0.06427938   0.88446701
x_center_forward      -0.16702029  -0.32508183
y_center_forward       1.00000000  -0.13487348
area_forward          -0.13487348   1.00000000
print("Correlations - P-values")
[1] "Correlations - P-values"
Hmisc::rcorr(as.matrix(viewing_fw_hearing))$P
                      aoasl      signyrs     selfrate gist_forward lex_forward upper_forward
aoasl                    NA 7.205586e-01 9.499685e-01 0.4793399090 0.686067180  1.022036e-01
signyrs          0.72055862           NA 5.732124e-05 0.0038575052 0.228450646  5.405296e-01
selfrate         0.94996853 5.732124e-05           NA 0.0001492417 0.023376771  5.428680e-01
gist_forward     0.47933991 3.857505e-03 1.492417e-04           NA 0.009323941  2.717140e-01
lex_forward      0.68606718 2.284506e-01 2.337677e-02 0.0093239409          NA  8.173593e-01
upper_forward    0.10220358 5.405296e-01 5.428680e-01 0.2717140006 0.817359283            NA
lower_forward    0.34590415 2.994715e-01 3.934694e-01 0.1836491489 0.853852367  2.718066e-06
left_forward     0.81577227 6.889748e-01 8.478954e-02 0.1875265080 0.012356773  8.655217e-01
right_forward    0.31537025 5.991154e-01 4.785770e-02 0.1236849749 0.010699693  3.223925e-01
width_forward    0.08380689 8.087198e-01 7.223243e-01 0.7301473188 0.909352119  6.296018e-02
height_forward   0.40332052 4.175692e-01 6.100346e-01 0.5790049735 0.505970667  4.954445e-01
x_center_forward 0.61059956 8.523537e-01 7.055914e-02 0.1996487442 0.018334621  7.040474e-01
y_center_forward 0.15720053 3.663409e-01 4.588967e-01 0.2357737876 0.900640346  6.661338e-15
area_forward     0.11230566 7.736141e-01 8.199919e-01 0.8581168777 0.770176202  1.225050e-01
                 lower_forward left_forward right_forward width_forward height_forward x_center_forward
aoasl             3.459042e-01 8.157723e-01  3.153703e-01  8.380689e-02   4.033205e-01     6.105996e-01
signyrs           2.994715e-01 6.889748e-01  5.991154e-01  8.087198e-01   4.175692e-01     8.523537e-01
selfrate          3.934694e-01 8.478954e-02  4.785770e-02  7.223243e-01   6.100346e-01     7.055914e-02
gist_forward      1.836491e-01 1.875265e-01  1.236850e-01  7.301473e-01   5.790050e-01     1.996487e-01
lex_forward       8.538524e-01 1.235677e-02  1.069969e-02  9.093521e-01   5.059707e-01     1.833462e-02
upper_forward     2.718066e-06 8.655217e-01  3.223925e-01  6.296018e-02   4.954445e-01     7.040474e-01
lower_forward               NA 1.004976e-01  1.198733e-01  7.523769e-01   2.817293e-02     1.647737e-01
left_forward      1.004976e-01           NA  3.541819e-09  1.614428e-01   8.365932e-03     1.776357e-15
right_forward     1.198733e-01 3.541819e-09            NA  5.366202e-01   2.797194e-01     2.244871e-12
width_forward     7.523769e-01 1.614428e-01  5.366202e-01            NA   1.229698e-04     5.317870e-01
height_forward    2.817293e-02 8.365932e-03  2.797194e-01  1.229698e-04             NA     7.456753e-02
x_center_forward  1.647737e-01 1.776357e-15  2.244871e-12  5.317870e-01   7.456753e-02               NA
y_center_forward  1.180958e-09 4.710037e-01  2.250816e-01  3.139223e-01   7.707583e-01     4.462352e-01
area_forward      3.004121e-01 2.027749e-02  7.086984e-01  1.921425e-10   2.146621e-08     1.301398e-01
                 y_center_forward area_forward
aoasl                1.572005e-01 1.123057e-01
signyrs              3.663409e-01 7.736141e-01
selfrate             4.588967e-01 8.199919e-01
gist_forward         2.357738e-01 8.581169e-01
lex_forward          9.006403e-01 7.701762e-01
upper_forward        6.661338e-15 1.225050e-01
lower_forward        1.180958e-09 3.004121e-01
left_forward         4.710037e-01 2.027749e-02
right_forward        2.250816e-01 7.086984e-01
width_forward        3.139223e-01 1.921425e-10
height_forward       7.707583e-01 2.146621e-08
x_center_forward     4.462352e-01 1.301398e-01
y_center_forward               NA 5.394975e-01
area_forward         5.394975e-01           NA
corstarsl(viewing_fw_hearing)

Hearing Viewing Correlations, Reversed

print("Correlations - Pearson's r")
[1] "Correlations - Pearson's r"
Hmisc::rcorr(as.matrix(viewing_rv_hearing))$r
                        aoasl     signyrs    selfrate gist_reversed lex_reversed upper_reversed
aoasl              1.00000000 -0.07887013  0.01385561   0.078157514   0.06994864     0.29120520
signyrs           -0.07887013  1.00000000  0.73847854   0.288457483   0.22209269    -0.22765477
selfrate           0.01385561  0.73847854  1.00000000   0.521440804   0.36876982    -0.18131365
gist_reversed      0.07815751  0.28845748  0.52144080   1.000000000   0.61989301     0.29483622
lex_reversed       0.06994864  0.22209269  0.36876982   0.619893014   1.00000000     0.22990465
upper_reversed     0.29120520 -0.22765477 -0.18131365   0.294836223   0.22990465     1.00000000
lower_reversed     0.27919510 -0.35447890 -0.20364781   0.174618781   0.08420976     0.79754835
left_reversed     -0.14427562  0.07819807  0.35847303   0.161581472   0.11546121    -0.09117055
right_reversed    -0.21672772  0.05733023  0.33877006   0.005462218   0.06471621    -0.25686115
width_reversed    -0.18005639 -0.05186101 -0.04896778  -0.387987047  -0.12611170    -0.41177213
height_reversed   -0.01361460 -0.20464318 -0.03864136  -0.184570715  -0.22603497    -0.30154538
x_center_reversed -0.15748245  0.08238515  0.36619380   0.088240229   0.10339727    -0.17253478
y_center_reversed  0.29856527 -0.27503476 -0.18721636   0.295955807   0.22641186     0.98072094
area_reversed     -0.05431629 -0.04452477  0.01864461  -0.350326598  -0.27433854    -0.40965101
                  lower_reversed left_reversed right_reversed width_reversed height_reversed
aoasl                 0.27919510   -0.14427562   -0.216727719    -0.18005639     -0.01361460
signyrs              -0.35447890    0.07819807    0.057330232    -0.05186101     -0.20464318
selfrate             -0.20364781    0.35847303    0.338770062    -0.04896778     -0.03864136
gist_reversed         0.17461878    0.16158147    0.005462218    -0.38798705     -0.18457071
lex_reversed          0.08420976    0.11546121    0.064716205    -0.12611170     -0.22603497
upper_reversed        0.79754835   -0.09117055   -0.256861150    -0.41177213     -0.30154538
lower_reversed        1.00000000   -0.24249436   -0.224835187     0.04388789      0.33467758
left_reversed        -0.24249436    1.00000000    0.919043899    -0.20119736     -0.24084954
right_reversed       -0.22483519    0.91904390    1.000000000     0.20118581      0.04588299
width_reversed        0.04388789   -0.20119736    0.201185808     1.00000000      0.71258640
height_reversed       0.33467758   -0.24084954    0.045882992     0.71258640      1.00000000
x_center_reversed    -0.23547460    0.98036140    0.966367126    -0.03478441     -0.10265730
y_center_reversed     0.88877416   -0.11486547   -0.237773597    -0.30544943     -0.12724651
area_reversed         0.18353483   -0.28033984    0.067378499     0.86414796      0.92998672
                  x_center_reversed y_center_reversed area_reversed
aoasl                   -0.15748245         0.2985653   -0.05431629
signyrs                  0.08238515        -0.2750348   -0.04452477
selfrate                 0.36619380        -0.1872164    0.01864461
gist_reversed            0.08824023         0.2959558   -0.35032660
lex_reversed             0.10339727         0.2264119   -0.27433854
upper_reversed          -0.17253478         0.9807209   -0.40965101
lower_reversed          -0.23547460         0.8887742    0.18353483
left_reversed            0.98036140        -0.1148655   -0.28033984
right_reversed           0.96636713        -0.2377736    0.06737850
width_reversed          -0.03478441        -0.3054494    0.86414796
height_reversed         -0.10265730        -0.1272465    0.92998672
x_center_reversed        1.00000000        -0.1714985   -0.11948840
y_center_reversed       -0.17149848         1.0000000   -0.26223204
area_reversed           -0.11948840        -0.2622320    1.00000000
print("Correlations - P-values")
[1] "Correlations - P-values"
Hmisc::rcorr(as.matrix(viewing_rv_hearing))$P
                      aoasl      signyrs     selfrate gist_reversed lex_reversed upper_reversed
aoasl                    NA 7.205586e-01 9.499685e-01   0.722986497  0.751135086   1.776187e-01
signyrs           0.7205586           NA 5.732124e-05   0.181932462  0.308433949   2.961589e-01
selfrate          0.9499685 5.732124e-05           NA   0.010720157  0.083351359   4.076969e-01
gist_reversed     0.7229865 1.819325e-01 1.072016e-02            NA  0.001604978   1.720272e-01
lex_reversed      0.7511351 3.084339e-01 8.335136e-02   0.001604978           NA   2.912809e-01
upper_reversed    0.1776187 2.961589e-01 4.076969e-01   0.172027231  0.291280912             NA
lower_reversed    0.1970021 9.699207e-02 3.513293e-01   0.425513759  0.702451023   5.178148e-06
left_reversed     0.5113189 7.228483e-01 9.302387e-02   0.461387343  0.599852316   6.790800e-01
right_reversed    0.3205647 7.949974e-01 1.138204e-01   0.980266256  0.769241348   2.367512e-01
width_reversed    0.4110110 8.142054e-01 8.244091e-01   0.067343147  0.566387734   5.090588e-02
height_reversed   0.9508378 3.489292e-01 8.610421e-01   0.399180433  0.299701942   1.620190e-01
x_center_reversed 0.4729804 7.086216e-01 8.569712e-02   0.688885299  0.638723400   4.311445e-01
y_center_reversed 0.1664130 2.040386e-01 3.923363e-01   0.170328044  0.298875216   2.220446e-16
area_reversed     0.8055689 8.401318e-01 9.327090e-01   0.101248885  0.205232483   5.223092e-02
                  lower_reversed left_reversed right_reversed width_reversed height_reversed
aoasl               1.970021e-01  5.113189e-01   3.205647e-01   4.110110e-01    9.508378e-01
signyrs             9.699207e-02  7.228483e-01   7.949974e-01   8.142054e-01    3.489292e-01
selfrate            3.513293e-01  9.302387e-02   1.138204e-01   8.244091e-01    8.610421e-01
gist_reversed       4.255138e-01  4.613873e-01   9.802663e-01   6.734315e-02    3.991804e-01
lex_reversed        7.024510e-01  5.998523e-01   7.692413e-01   5.663877e-01    2.997019e-01
upper_reversed      5.178148e-06  6.790800e-01   2.367512e-01   5.090588e-02    1.620190e-01
lower_reversed                NA  2.649147e-01   3.023431e-01   8.423906e-01    1.185342e-01
left_reversed       2.649147e-01            NA   5.996887e-10   3.572792e-01    2.682698e-01
right_reversed      3.023431e-01  5.996887e-10             NA   3.573074e-01    8.353189e-01
width_reversed      8.423906e-01  3.572792e-01   3.573074e-01             NA    1.360489e-04
height_reversed     1.185342e-01  2.682698e-01   8.353189e-01   1.360489e-04              NA
x_center_reversed   2.794214e-01  2.220446e-16   7.305268e-14   8.748001e-01    6.411393e-01
y_center_reversed   1.469009e-08  6.017484e-01   2.746164e-01   1.563863e-01    5.628716e-01
area_reversed       4.018782e-01  1.950953e-01   7.600136e-01   1.071792e-07    1.370863e-10
                  x_center_reversed y_center_reversed area_reversed
aoasl                  4.729804e-01      1.664130e-01  8.055689e-01
signyrs                7.086216e-01      2.040386e-01  8.401318e-01
selfrate               8.569712e-02      3.923363e-01  9.327090e-01
gist_reversed          6.888853e-01      1.703280e-01  1.012489e-01
lex_reversed           6.387234e-01      2.988752e-01  2.052325e-01
upper_reversed         4.311445e-01      2.220446e-16  5.223092e-02
lower_reversed         2.794214e-01      1.469009e-08  4.018782e-01
left_reversed          2.220446e-16      6.017484e-01  1.950953e-01
right_reversed         7.305268e-14      2.746164e-01  7.600136e-01
width_reversed         8.748001e-01      1.563863e-01  1.071792e-07
height_reversed        6.411393e-01      5.628716e-01  1.370863e-10
x_center_reversed                NA      4.339592e-01  5.871013e-01
y_center_reversed      4.339592e-01                NA  2.267467e-01
area_reversed          5.871013e-01      2.267467e-01            NA
corstarsl(viewing_rv_hearing)

All Viewing Correlations, Forward

print("Correlations - Pearson's r")
[1] "Correlations - Pearson's r"
Hmisc::rcorr(as.matrix(viewing_fw))$r
                        aoasl     signyrs     selfrate gist_forward  lex_forward upper_forward
aoasl             1.000000000 -0.78522450 -0.506162763 -0.323090315 -0.142631680   0.001356982
signyrs          -0.785224497  1.00000000  0.709593415  0.495618284  0.363347173   0.060403593
selfrate         -0.506162763  0.70959342  1.000000000  0.734904349  0.461124361   0.075103939
gist_forward     -0.323090315  0.49561828  0.734904349  1.000000000  0.487500101  -0.030892283
lex_forward      -0.142631680  0.36334717  0.461124361  0.487500101  1.000000000   0.033564895
upper_forward     0.001356982  0.06040359  0.075103939 -0.030892283  0.033564895   1.000000000
lower_forward    -0.006478702  0.03249385  0.021259710 -0.088990003 -0.006277059   0.895914733
left_forward     -0.092727087  0.13149299  0.288534403  0.282620907  0.397213399   0.029398540
right_forward    -0.055398103  0.10558031  0.239055037  0.249726847  0.346656233  -0.019205190
width_forward     0.041759353 -0.01759426 -0.027238293 -0.002695181 -0.010451116  -0.069875702
height_forward   -0.017349603 -0.05616254 -0.112550974 -0.132791281 -0.085513465  -0.130894706
x_center_forward -0.070069700  0.12029249  0.266321212  0.244784907  0.345540673   0.073676445
y_center_forward -0.019405542  0.07602873  0.072900355 -0.038638737  0.036020294   0.972782254
area_forward     -0.006446591  0.03916390  0.007284405  0.008445134 -0.000269138  -0.001654218
                 lower_forward left_forward right_forward width_forward height_forward x_center_forward
aoasl             -0.006478702  -0.09272709   -0.05539810   0.041759353    -0.01734960      -0.07006970
signyrs            0.032493852   0.13149299    0.10558031  -0.017594256    -0.05616254       0.12029249
selfrate           0.021259710   0.28853440    0.23905504  -0.027238293    -0.11255097       0.26632121
gist_forward      -0.088990003   0.28262091    0.24972685  -0.002695181    -0.13279128       0.24478491
lex_forward       -0.006277059   0.39721340    0.34665623  -0.010451116    -0.08551347       0.34554067
upper_forward      0.895914733   0.02939854   -0.01920519  -0.069875702    -0.13089471       0.07367644
lower_forward      1.000000000  -0.16475324    0.01644207   0.251135379     0.32313353       0.03405660
left_forward      -0.164753243   1.00000000    0.76998752  -0.184553713    -0.43031511       0.87139159
right_forward      0.016442072   0.76998752    1.00000000   0.484994620     0.07760803       0.95923972
width_forward      0.251135379  -0.18455371    0.48499462   1.000000000     0.70932758       0.28322691
height_forward     0.323133528  -0.43031511    0.07760803   0.709327579     1.00000000      -0.08095060
x_center_forward   0.034056604   0.87139159    0.95923972   0.283226907    -0.08095060       1.00000000
y_center_forward   0.962259114  -0.04127393    0.04347491   0.123535395     0.07515167       0.10167994
area_forward       0.343583018  -0.22389339    0.42376271   0.959601104     0.77031147       0.25781175
                 y_center_forward area_forward
aoasl                 -0.01940554 -0.006446591
signyrs                0.07602873  0.039163902
selfrate               0.07290035  0.007284405
gist_forward          -0.03863874  0.008445134
lex_forward            0.03602029 -0.000269138
upper_forward          0.97278225 -0.001654218
lower_forward          0.96225911  0.343583018
left_forward          -0.04127393 -0.223893389
right_forward          0.04347491  0.423762709
width_forward          0.12353539  0.959601104
height_forward         0.07515167  0.770311475
x_center_forward       0.10167994  0.257811755
y_center_forward       1.00000000  0.203034401
area_forward           0.20303440  1.000000000
print("Correlations - P-values")
[1] "Correlations - P-values"
Hmisc::rcorr(as.matrix(viewing_fw))$P
                        aoasl      signyrs     selfrate gist_forward  lex_forward upper_forward
aoasl                      NA 5.523138e-12 1.290503e-04 1.947866e-02 0.3131194667     0.9923823
signyrs          5.523138e-12           NA 3.880305e-09 1.870211e-04 0.0081064919     0.6705620
selfrate         1.290503e-04 3.880305e-09           NA 5.548220e-10 0.0005807587     0.5966908
gist_forward     1.947866e-02 1.870211e-04 5.548220e-10           NA 0.0002468463     0.8278935
lex_forward      3.131195e-01 8.106492e-03 5.807587e-04 2.468463e-04           NA     0.8132599
upper_forward    9.923823e-01 6.705620e-01 5.966908e-01 8.278935e-01 0.8132598971            NA
lower_forward    9.636423e-01 8.191170e-01 8.810833e-01 5.304212e-01 0.9647732091     0.0000000
left_forward     5.132272e-01 3.527841e-01 3.804049e-02 4.235052e-02 0.0035487020     0.8360980
right_forward    6.964846e-01 4.563149e-01 8.786113e-02 7.419046e-02 0.0118154624     0.8925040
width_forward    7.688045e-01 9.014742e-01 8.479937e-01 9.848708e-01 0.9413811868     0.6225537
height_forward   9.028376e-01 6.925026e-01 4.269533e-01 3.480087e-01 0.5466669968     0.3549982
x_center_forward 6.215856e-01 3.956335e-01 5.633838e-02 8.029519e-02 0.0121084801     0.6037052
y_center_forward 8.913893e-01 5.921659e-01 6.075337e-01 7.856556e-01 0.7998709712     0.0000000
area_forward     9.638224e-01 7.828127e-01 9.591245e-01 9.526181e-01 0.9984891253     0.9907138
                 lower_forward left_forward right_forward width_forward height_forward x_center_forward
aoasl               0.96364234 5.132272e-01  6.964846e-01  7.688045e-01   9.028376e-01       0.62158561
signyrs             0.81911700 3.527841e-01  4.563149e-01  9.014742e-01   6.925026e-01       0.39563346
selfrate            0.88108331 3.804049e-02  8.786113e-02  8.479937e-01   4.269533e-01       0.05633838
gist_forward        0.53042121 4.235052e-02  7.419046e-02  9.848708e-01   3.480087e-01       0.08029519
lex_forward         0.96477321 3.548702e-03  1.181546e-02  9.413812e-01   5.466670e-01       0.01210848
upper_forward       0.00000000 8.360980e-01  8.925040e-01  6.225537e-01   3.549982e-01       0.60370518
lower_forward               NA 2.431422e-01  9.078974e-01  7.251962e-02   1.946145e-02       0.81057431
left_forward        0.24314224           NA  2.519274e-11  1.902743e-01   1.451861e-03       0.00000000
right_forward       0.90789743 2.519274e-11            NA  2.685494e-04   5.844742e-01       0.00000000
width_forward       0.07251962 1.902743e-01  2.685494e-04            NA   3.956061e-09       0.04189120
height_forward      0.01946145 1.451861e-03  5.844742e-01  3.956061e-09             NA       0.56834512
x_center_forward    0.81057431 0.000000e+00  0.000000e+00  4.189120e-02   5.683451e-01               NA
y_center_forward    0.00000000 7.714191e-01  7.595850e-01  3.829247e-01   5.964569e-01       0.47321204
area_forward        0.01263779 1.105780e-01  1.745315e-03  0.000000e+00   2.442246e-11       0.06500210
                 y_center_forward area_forward
aoasl                   0.8913893 9.638224e-01
signyrs                 0.5921659 7.828127e-01
selfrate                0.6075337 9.591245e-01
gist_forward            0.7856556 9.526181e-01
lex_forward             0.7998710 9.984891e-01
upper_forward           0.0000000 9.907138e-01
lower_forward           0.0000000 1.263779e-02
left_forward            0.7714191 1.105780e-01
right_forward           0.7595850 1.745315e-03
width_forward           0.3829247 0.000000e+00
height_forward          0.5964569 2.442246e-11
x_center_forward        0.4732120 6.500210e-02
y_center_forward               NA 1.488528e-01
area_forward            0.1488528           NA
corstarsl(viewing_fw)

All Viewing Correlations, Reversed

print("Correlations - Pearson's r")
[1] "Correlations - Pearson's r"
Hmisc::rcorr(as.matrix(viewing_rv))$r
                         aoasl     signyrs     selfrate gist_reversed lex_reversed upper_reversed
aoasl              1.000000000 -0.78501874 -0.504229784   -0.32326382  -0.25779733    -0.02912146
signyrs           -0.785018742  1.00000000  0.707270503    0.23410876   0.24984565     0.05225378
selfrate          -0.504229784  0.70727050  1.000000000    0.37615052   0.35782853     0.01476570
gist_reversed     -0.323263824  0.23410876  0.376150519    1.00000000   0.44831455    -0.08009174
lex_reversed      -0.257797331  0.24984565  0.357828528    0.44831455   1.00000000     0.14140327
upper_reversed    -0.029121457  0.05225378  0.014765698   -0.08009174   0.14140327     1.00000000
lower_reversed     0.080000073 -0.09483062 -0.091817863   -0.16535316  -0.01946622     0.88218427
left_reversed     -0.114980593  0.12695912  0.245822698    0.09016509   0.01160488    -0.08753213
right_reversed    -0.069880381  0.06205640  0.177639216   -0.03496294  -0.07538363    -0.26386130
width_reversed     0.103094742 -0.14764744 -0.157195657   -0.28178790  -0.19495086    -0.39311412
height_reversed    0.220610574 -0.29881826 -0.213945329   -0.16083704  -0.33627430    -0.34682569
x_center_reversed -0.097804099  0.10798841  0.241739154    0.03978310  -0.01230040    -0.16607711
y_center_reversed -0.004638618  0.02209786 -0.006599445   -0.11125724   0.10234027     0.98829937
area_reversed      0.201892376 -0.24148084 -0.179041639   -0.27645513  -0.33555475    -0.38088456
                  lower_reversed left_reversed right_reversed width_reversed height_reversed
aoasl                 0.08000007   -0.11498059    -0.06988038     0.10309474      0.22061057
signyrs              -0.09483062    0.12695912     0.06205640    -0.14764744     -0.29881826
selfrate             -0.09181786    0.24582270     0.17763922    -0.15719566     -0.21394533
gist_reversed        -0.16535316    0.09016509    -0.03496294    -0.28178790     -0.16083704
lex_reversed         -0.01946622    0.01160488    -0.07538363    -0.19495086     -0.33627430
upper_reversed        0.88218427   -0.08753213    -0.26386130    -0.39311412     -0.34682569
lower_reversed        1.00000000   -0.21623908    -0.25873458    -0.09112290      0.13571094
left_reversed        -0.21623908    1.00000000     0.90108287    -0.23997959     -0.24653567
right_reversed       -0.25873458    0.90108287     1.00000000     0.20473331      0.03980714
width_reversed       -0.09112290   -0.23997959     0.20473331     1.00000000      0.64558840
height_reversed       0.13571094   -0.24653567     0.03980714     0.64558840      1.00000000
x_center_reversed    -0.23499404    0.97773314     0.95975000    -0.05838507     -0.11863818
y_center_reversed     0.93523651   -0.11419866    -0.25582981    -0.31494343     -0.21654095
area_reversed         0.05863852   -0.29277378     0.07789063     0.83521110      0.91814744
                  x_center_reversed y_center_reversed area_reversed
aoasl                   -0.09780410      -0.004638618    0.20189238
signyrs                  0.10798841       0.022097856   -0.24148084
selfrate                 0.24173915      -0.006599445   -0.17904164
gist_reversed            0.03978310      -0.111257240   -0.27645513
lex_reversed            -0.01230040       0.102340266   -0.33555475
upper_reversed          -0.16607711       0.988299370   -0.38088456
lower_reversed          -0.23499404       0.935236514    0.05863852
left_reversed            0.97773314      -0.114198662   -0.29277378
right_reversed           0.95975000      -0.255829811    0.07789063
width_reversed          -0.05838507      -0.314943433    0.83521110
height_reversed         -0.11863818      -0.216540948    0.91814744
x_center_reversed        1.00000000      -0.175098449   -0.13330269
y_center_reversed       -0.17509845       1.000000000   -0.26857141
area_reversed           -0.13330269      -0.268571407    1.00000000
print("Correlations - P-values")
[1] "Correlations - P-values"
Hmisc::rcorr(as.matrix(viewing_rv))$P
                         aoasl      signyrs     selfrate gist_reversed lex_reversed upper_reversed
aoasl                       NA 9.197088e-12 1.615663e-04  0.0206764715 0.0677889791    0.839247619
signyrs           9.197088e-12           NA 6.557459e-09  0.0982310781 0.0770305388    0.715735276
selfrate          1.615663e-04 6.557459e-09           NA  0.0065211917 0.0099363432    0.918090325
gist_reversed     2.067647e-02 9.823108e-02 6.521192e-03            NA 0.0009694904    0.576374362
lex_reversed      6.778898e-02 7.703054e-02 9.936343e-03  0.0009694904           NA    0.322285915
upper_reversed    8.392476e-01 7.157353e-01 9.180903e-01  0.5763743620 0.3222859152             NA
lower_reversed    5.768123e-01 5.080154e-01 5.216457e-01  0.2462173049 0.8921509451    0.000000000
left_reversed     4.217212e-01 3.746526e-01 8.207079e-02  0.5291997947 0.9355823265    0.541344222
right_reversed    6.260669e-01 6.653039e-01 2.123629e-01  0.8075640462 0.5990621632    0.061353509
width_reversed    4.715785e-01 3.011578e-01 2.706195e-01  0.0451475537 0.1704038419    0.004321718
height_reversed   1.197907e-01 3.317020e-02 1.316792e-01  0.2595353013 0.0158363459    0.012654281
x_center_reversed 4.947427e-01 4.506796e-01 8.744839e-02  0.7816461097 0.9317304187    0.244126388
y_center_reversed 9.742286e-01 8.776754e-01 9.633409e-01  0.4370079024 0.4748460315    0.000000000
area_reversed     1.553942e-01 8.779761e-02 2.087169e-01  0.0495534525 0.0160761996    0.005826220
                  lower_reversed left_reversed right_reversed width_reversed height_reversed
aoasl                 0.57681234    0.42172115     0.62606686   4.715785e-01    1.197907e-01
signyrs               0.50801540    0.37465262     0.66530394   3.011578e-01    3.317020e-02
selfrate              0.52164570    0.08207079     0.21236295   2.706195e-01    1.316792e-01
gist_reversed         0.24621730    0.52919979     0.80756405   4.514755e-02    2.595353e-01
lex_reversed          0.89215095    0.93558233     0.59906216   1.704038e-01    1.583635e-02
upper_reversed        0.00000000    0.54134422     0.06135351   4.321718e-03    1.265428e-02
lower_reversed                NA    0.12749191     0.06676057   5.248155e-01    3.423431e-01
left_reversed         0.12749191            NA     0.00000000   8.984879e-02    8.115912e-02
right_reversed        0.06676057    0.00000000             NA   1.495402e-01    7.815174e-01
width_reversed        0.52481554    0.08984879     0.14954025             NA    3.135205e-07
height_reversed       0.34234311    0.08115912     0.78151743   3.135205e-07              NA
x_center_reversed     0.09692972    0.00000000     0.00000000   6.840348e-01    4.070048e-01
y_center_reversed     0.00000000    0.42490602     0.06998893   2.438493e-02    1.269484e-01
area_reversed         0.68273549    0.03707699     0.58693238   2.531308e-14    0.000000e+00
                  x_center_reversed y_center_reversed area_reversed
aoasl                    0.49474269        0.97422861  1.553942e-01
signyrs                  0.45067957        0.87767544  8.779761e-02
selfrate                 0.08744839        0.96334091  2.087169e-01
gist_reversed            0.78164611        0.43700790  4.955345e-02
lex_reversed             0.93173042        0.47484603  1.607620e-02
upper_reversed           0.24412639        0.00000000  5.826220e-03
lower_reversed           0.09692972        0.00000000  6.827355e-01
left_reversed            0.00000000        0.42490602  3.707699e-02
right_reversed           0.00000000        0.06998893  5.869324e-01
width_reversed           0.68403480        0.02438493  2.531308e-14
height_reversed          0.40700481        0.12694841  0.000000e+00
x_center_reversed                NA        0.21908161  3.510565e-01
y_center_reversed        0.21908161                NA  5.670100e-02
area_reversed            0.35105648        0.05670100            NA
corstarsl(viewing_rv)
LS0tCnRpdGxlOiAiVGhlIExhc3QgRGF0YSBBbmFseXNpcyB0byBSdWxlIFRoZW0gQWxsPyAoc3R1ZHkxYWR1bHRzKSIKYXV0aG9yOiAiQWRhbSBTdG9uZSwgUGhEIgpkYXRlOiAnYHIgZm9ybWF0KFN5cy5EYXRlKCksICIlbS0lZC0lWSIpYCcKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHRoZW1lOiBwYXBlcgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UpCmBgYAoKIyBQdXR0aW5nIEl0IEFsbCBCYWNrIFRvZ2V0aGVyCgpUaHJvdWdob3V0IGFsbCB0aGUgZGF0YSBhbmFseXNpcyB3ZSd2ZSBkb25lLCB0aGUgZGF0YXNldHMgaGF2ZSBiZWNvbWUgbW9yZSBmcmFnbWVudGVkIC0gbGV4aWNhbCByZWNhbGwsIGdpc3QsIGFuZCBleWUgdHJhY2tpbmcgZGF0YXNldHMuIEkgd2FudCB0byBwdXQgdGhlbSBhbGwgdG9nZXRoZXIgaW4gb25lIHdob2xlIGRhdGFzZXQgYWdhaW4gc28gd2UgY2FuIHBlcmZvcm0gc29tZSBhbmFseXNlcyBtb3JlIGVmZmljaWVudGx5IChwYXJ0aWN1bGFybHkgY29ycmVsYXRpb25zKS4gVGhlIG9ubHkgdGhpbmcgSSBuZWVkIHRvIHJlbWVtYmVyIGlzIHdlJ2xsIGhhdmUgYSBuZXcgY29sdW1uIGNhbGxlZCBgZXllX2V4Y2x1ZGVgIGFuZCBpZiBpdCBpcyBzZXQgdG8gYFRSVUVgIGl0IG1lYW5zIHdlIGNhbid0IGluY2x1ZGUgdGhhdCByb3cgaW4gYW55IGFuYWx5c2lzIHJlbGF0aW5nIHRvIGV5ZSBnYXplICh1c3VhbGx5IGJlY2F1c2UgdGhhdCB0cmlhbCB3YXMgbGVzcyB0aGFuIDI1JSBsb29raW5nKS4gCgpgYGB7ciBzbWFzaCBkYXRhIHRvZ2V0aGVyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIExpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KGFncmljb2xhZSkgCmxpYnJhcnkoR0dhbGx5KQpsaWJyYXJ5KGV6KQoKIyBMb2FkIGxleCBhbmQgZXllIGRhdGEKY2xlYW5sZXhkYXRhIDwtIHJlYWRfY3N2KCJjbGVhbmRhdGEuY3N2IikgJT4lCiAgc2VsZWN0KC0oZm9yZWhlYWQ6dG90YWwpKQoKY2xlYW5leWVkYXRhIDwtIHJlYWRfY3N2KCJjbGVhbnBlcmNlbnRkYXRhLmNzdiIpICU+JQogIHNwcmVhZChhb2kscGVyY2VudCkgJT4lCiAgYWRkX2NvbHVtbihleWVfZXhjbHVkZSA9IEZBTFNFKQoKIyBXaGF0IHJvd3Mgd2VyZSByZW1vdmVkIGZyb20gdGhlIGV5ZSBkYXRhIGJhY2sgaW4gMDNleWVnYXplPyBMZXQncyBhZGQgYmFjayBpbgojIFdpdGggYSBuZXcgY29sdW1uIC0gZXllX2V4Y2x1ZGUKcmVtb3ZlZCA8LSBhbnRpX2pvaW4oY2xlYW5sZXhkYXRhLCBjbGVhbmV5ZWRhdGEpICU+JQogIGFkZF9jb2x1bW4oZXllX2V4Y2x1ZGUgPSBUUlVFKQpleWVsZXhkYXRhIDwtIGJpbmRfcm93cyhjbGVhbmV5ZWRhdGEsIHJlbW92ZWQpCgojIExvYWQgZ2lzdCBkYXRhCmdpc3QgPC0gcmVhZF9jc3YoJ2dpc3RfaW5kaXYuY3N2JywgY29sX3R5cGVzID0gY29scygKICBwYXJ0aWNpcGFudCA9IGNvbF9jaGFyYWN0ZXIoKSwKICBnaXN0LmZ3MSA9IGNvbF9pbnRlZ2VyKCksCiAgZ2lzdC5ydjIgPSBjb2xfaW50ZWdlcigpLAogIGdpc3QuZnczID0gY29sX2ludGVnZXIoKSwKICBnaXN0LnJ2NCA9IGNvbF9pbnRlZ2VyKCkKKSkgJT4lCiAgZ2F0aGVyKHZpZGVvLCBnaXN0LCBnaXN0LmZ3MTpnaXN0LnJ2NCkgJT4lCiAgbXV0YXRlKHZpZGVvID0gc3RyX3N1Yih2aWRlbyw2LDgpKQoKIyBQcmVzdG8sIG91ciBmdWxsIHJldW5pZmllZCBkYXRhc2V0IC0gJ2Z1bGxkYXRhJwojIEJ1dCBJIHdhbnQgdG8gcmVtb3ZlIGNvbHVtbnMgSSBkb24ndCB3YW50IGFueW1vcmUgYW5kIHdpbGwgcmVjYWxjdWxhdGUgbGF0ZXIKZnVsbGRhdGEgPC0gbGVmdF9qb2luKGV5ZWxleGRhdGEsIGdpc3QpICU+JQogIHNlbGVjdCgtbW91dGhleWUsIC1mYWNlY2hlc3QsIC1mYWNlLCAtY2hlc3QpCmBgYAoKIyBHcm91cCBDaGFuZ2VzIGFuZCBQYXJ0aWNpcGFudCBUYWJsZXMKCldlIGhhdmUgc29tZSBjaGFuZ2VzIHRvIG1ha2UgdG8gdGhlIGdyb3Vwcy4gRmlyc3QsIGZpeCBKb3NoIGFzIGxlYXJuaW5nIEFTTCB3aGVuIGhlIHdhcyA2LiBOZXh0LCBkcm9wIHRoZSBEZWFmTmF0aXZlIEdyb3VwIGFuZCByZWNsYXNzaWZ5IGFsbCB3aG8gbGVhcm5lZCBBU0wgPCAzLjkgYXMgRGVhZkVhcmx5IGFuZCBBU0wgPT4gNC4wIGFzIERlYWZMYXRlLiAKCmBgYHtyIGdyb3VwcyBhbmQgcGFydGljaXBhbnQgdGFibGVzfQojIENoYW5nZSBKb3NoJ3MgQW9BU0wgdG8gNgpmdWxsZGF0YSA8LSBmdWxsZGF0YSAlPiUKICBtdXRhdGUoYW9hc2wgPSBhcy5kb3VibGUoYW9hc2wpKSAlPiUKICBtdXRhdGUoYW9hc2wgPSBjYXNlX3doZW4oCiAgICBwYXJ0aWNpcGFudCA9PSAiSm9zaCIgfiA2LAogICAgVFJVRSB+IGFvYXNsCiAgKSkKCiMgUmVjbGFzc2lmeSBHcm91cHMKZnVsbGRhdGEgPC0gZnVsbGRhdGEgJT4lCiAgbXV0YXRlKG1haW5ncm91cCA9IGNhc2Vfd2hlbigKICAgIGhlYXJpbmcgPT0gIkRlYWYiICYgYW9hc2wgPCA0IH4gIkRlYWZFYXJseSIsCiAgICBoZWFyaW5nID09ICJEZWFmIiAmIGFvYXNsID49IDQgfiAiRGVhZkxhdGUiLAogICAgbWFpbmdyb3VwID09ICJIZWFyaW5nTGF0ZUFTTCIgfiAiSGVhcmluZ0xhdGUiLAogICAgbWFpbmdyb3VwID09ICJIZWFyaW5nTm92aWNlQVNMIiB+ICJIZWFyaW5nTm92aWNlIgogICkpCgojIENyZWF0ZSBQYXJ0aWNpcGFudCBEZW1vZ3JhcGhpY3MgVGFibGUKcGFydGljaXBhbnRfaW5mbyA8LSBmdWxsZGF0YSAlPiUKICBzZWxlY3QoLShhY2M6Z2lzdCkpICU+JQogIHNlbGVjdCgtKHZpZGVvOmRpcmVjdGlvbikpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGdyb3VwX2J5KG1haW5ncm91cCkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCksCiAgICAgICAgICAgIGFnZV9tZWFuID0gbWVhbihhZ2UpLAogICAgICAgICAgICBhZ2Vfc2QgPSBzZChhZ2UpLAogICAgICAgICAgICBhb2FzbF9tZWFuID0gbWVhbihhb2FzbCksCiAgICAgICAgICAgIGFvYXNsX3NkID0gc2QoYW9hc2wpLAogICAgICAgICAgICBzaWdueXJzX21lYW4gPSBtZWFuKHNpZ255cnMpLAogICAgICAgICAgICBzaWdueXJzX3NkID0gc2Qoc2lnbnlycyksCiAgICAgICAgICAgIHNlbGZyYXRlX21lYW4gPSBtZWFuKHNlbGZyYXRlKSwKICAgICAgICAgICAgc2VsZnJhdGVfc2QgPSBzZChzZWxmcmF0ZSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGVfaWYoaXMuZG91YmxlLCBmdW5zKHJvdW5kKC4sIDIpKSkgJT4lCiAgbXV0YXRlKGFnZSA9IHBhc3RlKGFnZV9tZWFuLCAiwrEiLCBhZ2Vfc2QsIHNlcCA9ICIgIiksCiAgICAgICAgIGFvYXNsID0gcGFzdGUoYW9hc2xfbWVhbiwgIsKxIiwgYW9hc2xfc2QsIHNlcCA9ICIgIiksCiAgICAgICAgIHNpZ255cnMgPSBwYXN0ZShzaWdueXJzX21lYW4sICLCsSIsIHNpZ255cnNfc2QsIHNlcCA9ICIgIiksCiAgICAgICAgIHNlbGZyYXRlID0gcGFzdGUoc2VsZnJhdGVfbWVhbiwgIsKxIiwgc2VsZnJhdGVfc2QsIHNlcCA9ICIgIikpICU+JQogIHNlbGVjdCgtKGFnZV9tZWFuOnNlbGZyYXRlX3NkKSkKCnBhcnRpY2lwYW50X2luZm8Kd3JpdGVfY3N2KGZ1bGxkYXRhLCAiZmluYWxkYXRhc2V0LmNzdiIpCgpkYXRhX2xvd2FvaSA8LSBmdWxsZGF0YSAlPiUgc2VsZWN0KHBhcnRpY2lwYW50LCBzdG9yeSwgYmVsbHk6dXBwZXJjaGVzdCkgJT4lIHNlbGVjdCgtZXllcywgLW1vdXRoLCAtY2hpbikgJT4lIGdhdGhlcihhb2ksIHBlcmNlbnQsIGJlbGx5OnVwcGVyY2hlc3QpCmRhdGFfbG93YW9pJHBlcmNlbnRbaXMubmEoZGF0YV9sb3dhb2kkcGVyY2VudCldIDwtIDAKbWVhbihkYXRhX2xvd2FvaSRwZXJjZW50LCBuYS5ybT1UUlVFKQpzZChkYXRhX2xvd2FvaSRwZXJjZW50LCBuYS5ybT1UUlVFKQpgYGAKIyMgUGFydGljaXBhbnQgQU5PVkFzIAoKQmVsb3cgYXJlIHRoZSBBTk9WQSBvdXRwdXRzIGZvciBwYXJ0aWNpcGFudCBkZW1vZ3JhcGhpY3MsIGFuZCBMU0RzIGZvciBlYWNoLiAKClBhcnRpY2lwYW50cycgYWdlCmBgYHtyIHN1YmplY3QgYW5vdmEgYWdlLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIE1ha2UgdGhlIHBhcnRpY2lwYW50IGRhdGEgZnJhbWUKcF9hbm92YXMgPC0gZnVsbGRhdGEgJT4lCiAgc2VsZWN0KC0oYWNjOmdpc3QpKSAlPiUKICBzZWxlY3QoLSh2aWRlbzpkaXJlY3Rpb24pKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIHNlbGVjdChtYWluZ3JvdXA6YW9hc2wpCgojIEFnZSBBTk9WQQpwX2FnZSA8LSBhb3YoYWdlIH4gbWFpbmdyb3VwLCBkYXRhID0gcF9hbm92YXMpCnN1bW1hcnkocF9hZ2UpCnBfYWdlX2xzZCA8LSBMU0QudGVzdChwX2FnZSwgIm1haW5ncm91cCIsIGdyb3VwID0gRkFMU0UpJGNvbXBhcmlzb24KcF9hZ2VfbHNkCmBgYAoKClBhcnRpY2lwYW50cycgQW9BU0wKYGBge3Igc3ViamVjdCBhbm92YSBhb2FzbCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBBb0FTTCBBTk9WQQpwX2FvYXNsIDwtIGFvdihhb2FzbCB+IG1haW5ncm91cCwgZGF0YSA9IHBfYW5vdmFzKQpzdW1tYXJ5KHBfYW9hc2wpCnBfYW9hc2xfbHNkIDwtIExTRC50ZXN0KHBfYW9hc2wsICJtYWluZ3JvdXAiLCBncm91cCA9IEZBTFNFKSRjb21wYXJpc29uCnBfYW9hc2xfbHNkCmBgYAoKUGFydGljaXBhbnRzJyBTaWduIFlycwpgYGB7ciBzdWJqZWN0IGFub3ZhIHNpZ255cnMsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgU2lnbnlycyBBTk9WQQpwX3NpZ255cnMgPC0gYW92KHNpZ255cnMgfiBtYWluZ3JvdXAsIGRhdGEgPSBwX2Fub3ZhcykKc3VtbWFyeShwX3NpZ255cnMpCnBfc2lnbnlyc19sc2QgPC0gTFNELnRlc3QocF9zaWdueXJzLCAibWFpbmdyb3VwIiwgZ3JvdXAgPSBGQUxTRSkkY29tcGFyaXNvbgpwX3NpZ255cnNfbHNkCmBgYAoKUGFydGljaXBhbnRzJyBTZWxmLVJhdGluZwpgYGB7ciBzdWJqZWN0IGFub3ZhIHNlbGZyYXRlLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFNlbGZyYXRlIEFOT1ZBCnBfc2VsZnJhdGUgPC0gYW92KHNlbGZyYXRlIH4gbWFpbmdyb3VwLCBkYXRhID0gcF9hbm92YXMpCnN1bW1hcnkocF9zZWxmcmF0ZSkKcF9zZWxmcmF0ZV9sc2QgPC0gTFNELnRlc3QocF9zZWxmcmF0ZSwgIm1haW5ncm91cCIsIGdyb3VwID0gRkFMU0UpJGNvbXBhcmlzb24KcF9zZWxmcmF0ZV9sc2QKYGBgCgojIEdpc3QgJiBMZXhpY2FsIFJlY2FsbCBEYXRhCgojIyBUYWJsZXMgJiBDaGFydHMKCkxldCdzIGdlbmVyYXRlIGEgdGFibGUgZm9yIGxleGljYWwgcmVjYWxsIGFuZCBnaXN0IGZvciBmb3J3YXJkIHZzLiByZXZlcnNlZCBzdG9yaWVzLiAKCmBgYHtyIGxleCAmIGdpc3QgdGFibGV9CmxleGdpc3RfaW5mbyA8LSBmdWxsZGF0YSAlPiUKICBncm91cF9ieShtYWluZ3JvdXAsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGxleF9tZWFuID0gbWVhbihhY2MsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGxleF9zZCA9IHNkKGFjYywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgZ2lzdF9tZWFuID0gbWVhbihnaXN0KSwKICAgICAgICAgICAgZ2lzdF9zZCA9IHNkKGdpc3QpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlX2lmKGlzLmRvdWJsZSwgZnVucyhyb3VuZCguLCAyKSkpICU+JSAKICBtdXRhdGUobGV4ID0gcGFzdGUobGV4X21lYW4sICLCsSIsIGxleF9zZCwgc2VwID0gIiAiKSwKICAgICAgICAgZ2lzdCA9IHBhc3RlKGdpc3RfbWVhbiwgIsKxIiwgZ2lzdF9zZCwgc2VwID0gIiAiKSkgJT4lCiAgc2VsZWN0KC0obGV4X21lYW46Z2lzdF9zZCkpICU+JQogIGdhdGhlcihtZXRyaWMsIHZhbHVlLCBsZXg6Z2lzdCkgJT4lCiAgdW5pdGUoIm1ldHJpYyIsIGMobWV0cmljLCBkaXJlY3Rpb24pLCBzZXAgPSAiXyIpICU+JQogIHNwcmVhZChtZXRyaWMsIHZhbHVlKSAlPiUKICBwcmludCgpCmBgYAoKQW5kIHRoZW4gYmFyIGNoYXJ0cyB0b28gYWZ0ZXIgdGhhdCB3aXRoIGVycm9yIGJhcnMuIAoKYGBge3IgbGV4IGFuZCBnaXN0IGJhciBjaGFydHN9CiMgR2lzdCBiYXIgY2hhcnQKZ2lzdF9iYXIgPC0gZnVsbGRhdGEgJT4lIHNlbGVjdChwYXJ0aWNpcGFudCwgbWFpbmdyb3VwLCBkaXJlY3Rpb24sIGdpc3QpICU+JQogIGdyb3VwX2J5KG1haW5ncm91cCwgcGFydGljaXBhbnQsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGdpc3QgPSBtZWFuKGdpc3QpKSAlPiUKICBncm91cF9ieShtYWluZ3JvdXAsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGdpc3QpLAogICAgICAgICAgICBzZCA9IHNkKGdpc3QpLAogICAgICAgICAgICBjb3VudCA9IG4oKSwKICAgICAgICAgICAgc2UgPSBzZC9zcXJ0KGNvdW50KSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShtYWluZ3JvdXAgPSBjYXNlX3doZW4oCiAgICBtYWluZ3JvdXAgPT0gIkRlYWZFYXJseSIgfiAiRGVhZiBFYXJseSIsCiAgICBtYWluZ3JvdXAgPT0gIkRlYWZMYXRlIiB+ICJEZWFmIExhdGUiLAogICAgbWFpbmdyb3VwID09ICJIZWFyaW5nTGF0ZSIgfiAiSGVhcmluZyBMYXRlIiwKICAgIG1haW5ncm91cCA9PSAiSGVhcmluZ05vdmljZSIgfiAiSGVhcmluZyBOb3ZpY2UiCiAgICApKQoKZ2dwbG90KGdpc3RfYmFyLCBhZXMoeCA9IG1haW5ncm91cCwgeSA9IG1lYW4sIGZpbGwgPSBkaXJlY3Rpb24pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbi1zZSwgeW1heCA9IG1lYW4rc2UpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHdpZHRoID0gMC41KSArCiAgbGFicyh0aXRsZSA9ICJHaXN0IiwgeCA9ICIiLCB5ID0gIm1lYW4gZ2lzdCBhY2N1cmFjeSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCwgbGltaXRzID0gYygwLDEpKSArIHRoZW1lX2J3KCkKCiMgTGV4IGJhciBjaGFydApsZXhfYmFyIDwtIGZ1bGxkYXRhICU+JSBzZWxlY3QocGFydGljaXBhbnQsIG1haW5ncm91cCwgZGlyZWN0aW9uLCBhY2MpICU+JQogIGdyb3VwX2J5KG1haW5ncm91cCwgcGFydGljaXBhbnQsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGFjYyA9IG1lYW4oYWNjLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBncm91cF9ieShtYWluZ3JvdXAsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGFjYywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2QgPSBzZChhY2MsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGNvdW50ID0gbigpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQoY291bnQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKG1haW5ncm91cCA9IGNhc2Vfd2hlbigKICAgIG1haW5ncm91cCA9PSAiRGVhZkVhcmx5IiB+ICJEZWFmIEVhcmx5IiwKICAgIG1haW5ncm91cCA9PSAiRGVhZkxhdGUiIH4gIkRlYWYgTGF0ZSIsCiAgICBtYWluZ3JvdXAgPT0gIkhlYXJpbmdMYXRlIiB+ICJIZWFyaW5nIExhdGUiLAogICAgbWFpbmdyb3VwID09ICJIZWFyaW5nTm92aWNlIiB+ICJIZWFyaW5nIE5vdmljZSIKICAgICkpCgpnZ3Bsb3QobGV4X2JhciwgYWVzKHggPSBtYWluZ3JvdXAsIHkgPSBtZWFuLCBmaWxsID0gZGlyZWN0aW9uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW4tc2UsIHltYXggPSBtZWFuK3NlKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCB3aWR0aCA9IDAuNSkgKwogIGxhYnModGl0bGUgPSAiTGV4aWNhbCBSZWNhbGwiLCB4ID0gIiIsIHkgPSAibWVhbiBsZXhpY2FsIHJlY2FsbCBhY2N1cmFjeSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCwgbGltaXRzID0gYygwLDEpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLjUsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLjUsMSkpICsgdGhlbWVfYncoKQpgYGAKCkFuZCBsZXQncyBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgcmVkdWN0aW9uIGluIHNjb3JlIGR1ZSB0byByZXZlcnNhbCBmaXJzdCBpcyBsZXggcmVjYWxsLCB0aGVuIGdpc3QuCgpgYGB7cn0KcmV2ZXJzYWxfbGV4IDwtIGZ1bGxkYXRhICU+JQogIGdyb3VwX2J5KGlkLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShsZXhfbWVhbiA9IG1lYW4oYWNjLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBzcHJlYWQoZGlyZWN0aW9uLCBsZXhfbWVhbikgJT4lCiAgZ3JvdXBfYnkoaWQpICU+JQogIG11dGF0ZShyZXZlcnNhbCA9IGZvcndhcmQgLSByZXZlcnNlZCkgJT4lCiAgdW5ncm91cCgpCgpwYXN0ZSgibGV4IG1lYW4iLCBtZWFuKHJldmVyc2FsX2xleCRyZXZlcnNhbCkpCnBhc3RlKCJsZXggc2QiLCBzZChyZXZlcnNhbF9sZXgkcmV2ZXJzYWwpKQoKcmV2ZXJzYWxfZ2lzdCA8LSBmdWxsZGF0YSAlPiUKICBncm91cF9ieShpZCwgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoZ2lzdF9tZWFuID0gbWVhbihnaXN0LCBuYS5ybSA9IFRSVUUpKSAlPiUKICBzcHJlYWQoZGlyZWN0aW9uLCBnaXN0X21lYW4pICU+JQogIGdyb3VwX2J5KGlkKSAlPiUKICBtdXRhdGUocmV2ZXJzYWwgPSBmb3J3YXJkIC0gcmV2ZXJzZWQpICU+JQogIHVuZ3JvdXAoKQoKcGFzdGUoImdpc3QgbWVhbiIsIG1lYW4ocmV2ZXJzYWxfZ2lzdCRyZXZlcnNhbCkpCnBhc3RlKCJnaXN0IHNkIiwgc2QocmV2ZXJzYWxfZ2lzdCRyZXZlcnNhbCkpCgoKYGBgCgoKIyMgQU5PVkEgUGxhbgpOZXh0LCB3ZSdyZSBnb2luZyB0byBkbyBBTk9WQXMuIFdlJ2xsIGFsd2F5cyBkbyBpdCBpbiB0aGlzIG9yZGVyLgoKMS4gQU5PVkEgd2l0aCBmYWN0b3JzIE1haW5Hcm91cCAmIERpcmVjdGlvbgoyLiBBTk9WQSB3aXRoIGZhY3RvciBNYWluR3JvdXAsIGZvciBGb3J3YXJkIG9ubHkKMy4gQU5PVkEgd2l0aCBmYWN0b3IgTWFpbkdyb3VwLCBmb3IgUmV2ZXJzZSBvbmx5IAoKKEkgYWxzbyByYW4gQU5DT1ZBcyBiZWZvcmUgYnV0IG5vdyBoYXZlIHRha2VuIHRoZW0gb3V0Li4udGhleSBhcmUgYmVsb3c6ICg0KSBBTkNPVkEgd2l0aCBmYWN0b3IgRGlyZWN0aW9uLCBhbmQgY292YXJpYXRlIEFvQVNMIGFuZCBBZ2UsICg1KSBSZWdyZXNzaW9uIHdpdGggdmFyaWFibGVzIEFvQVNMIGFuZCBBZ2UsIGZvciBGb3J3YXJkIG9ubHksICg2KSBSZWdyZXNzaW9uIHdpdGggdmFyaWFibGVzIEFvQVNMIGFuZCBBZ2UsIGZvciBSZXZlcnNlIG9ubHkuKSAKCkkgZGlkIG5vdCBpbmNsdWRlIEFnZSBhcyBhIGNvdmFyaWF0ZSBpbiB0aGUgZmlyc3QgMyBBTk9WQXMgYmVjYXVzZSB0aGV5IGRpZCBub3QgYWRkIHRvIG9yIGNoYW5nZSB0aGUgbW9kZWwgaW4gYW55IHNpZ25pZmljYW50IHdheS4gCgojIyBHaXN0IEFOT1ZBcwoKMS4gQU5PVkEgd2l0aCBmYWN0b3JzIE1haW5Hcm91cCAmIERpcmVjdGlvbi4KCmBgYHtyIGdpc3QgYW5vdmExLCBlY2hvPVRSVUUsIHJlc3VsdHMgPSAnbWFya3VwJ30KIyBGaXJzdCBsZXQncyBtYWtlIHRoZSBwYXJ0aWNpcGFudC1sZXZlbCBkYXRhc2V0IHdpdGggd2hpY2ggd2UnbGwgZG8gb3VyIEFOQ09WQXMuIApwYXJ0aWNpcGFudF9kYXRhIDwtIGZ1bGxkYXRhICU+JQogIGdyb3VwX2J5KG1haW5ncm91cCwgcGFydGljaXBhbnQsIGRpcmVjdGlvbikgJT4lCiAgbXV0YXRlKGdpc3QgPSBtZWFuKGdpc3QsIG5hLnJtID0gVFJVRSksCiAgICAgICAgIGFjYyA9IG1lYW4oYWNjLCBuYS5ybSA9IFRSVUUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KGlkLCBwYXJ0aWNpcGFudCwgaGVhcmluZywgbWFpbmdyb3VwLCBkaXJlY3Rpb24sIGFnZSwgYW9hc2wsIGFjYywgZ2lzdCkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUoaWQgPSBmYWN0b3IoaWQpLAogICAgICAgICBwYXJ0aWNpcGFudCA9IGZhY3RvcihwYXJ0aWNpcGFudCksCiAgICAgICAgIGhlYXJpbmcgPSBmYWN0b3IoaGVhcmluZyksCiAgICAgICAgIG1haW5ncm91cCA9IGZhY3RvcihtYWluZ3JvdXApLAogICAgICAgICBkaXJlY3Rpb24gPSBmYWN0b3IoZGlyZWN0aW9uKSkKCiMgIyBHaXN0IEFOT1ZBIDEKIyBnaXN0X2FvdjEgPC0gYW92KGdpc3QgfiBtYWluZ3JvdXAgKiBkaXJlY3Rpb24sIGRhdGEgPSBwYXJ0aWNpcGFudF9kYXRhKQojIHN1bW1hcnkoZ2lzdF9hb3YxKQojIGdpc3RfbHNkMSA8LSBMU0QudGVzdChnaXN0X2FvdjEsICJtYWluZ3JvdXAiLCBncm91cCA9IEZBTFNFKQojIGdpc3RfbHNkMSRjb21wYXJpc29uCgojIEdpc3QgRVogQU5PVkEKZXpBTk9WQSgKICBkYXRhID0gcGFydGljaXBhbnRfZGF0YSwKICBkdiA9IGdpc3QsCiAgd2lkID0gaWQsCiAgd2l0aGluID0gZGlyZWN0aW9uLAogIGJldHdlZW4gPSBtYWluZ3JvdXAsCiAgdHlwZSA9IDMKKVsiQU5PVkEiXQpgYGAKCjIuIEFOT1ZBIHdpdGggZmFjdG9yIE1haW5Hcm91cCwgZm9yIEZvcndhcmQgb25seS4gKkluIHRoZSBjb2RlIGlzIGEgS3J1c2thbC1XYWxsaXMgdGVzdC4gQW5kIENoaS1TcSB0b28uKgoKYGBge3IgZ2lzdCBhbm92YTIsIGVjaG89VFJVRSwgcmVzdWx0cz0gJ21hcmt1cCd9CiMgIyBHaXN0IEFOT1ZBIDIKIyBnaXN0X2FvdjIgPC0gYW92KGdpc3QgfiBtYWluZ3JvdXAsIGRhdGEgPSBmaWx0ZXIocGFydGljaXBhbnRfZGF0YSwgZGlyZWN0aW9uID09ICJmb3J3YXJkIikpCiMgc3VtbWFyeShnaXN0X2FvdjIpCiMgZ2lzdF9sc2QyIDwtIExTRC50ZXN0KGdpc3RfYW92MiwgIm1haW5ncm91cCIsIGdyb3VwID0gRkFMU0UpCiMgZ2lzdF9sc2QyJGNvbXBhcmlzb24KCmV6QU5PVkEoCiAgZGF0YSA9IGZpbHRlcihwYXJ0aWNpcGFudF9kYXRhLCBkaXJlY3Rpb24gPT0gImZvcndhcmQiKSwKICBkdiA9IGdpc3QsCiAgd2lkID0gaWQsCiAgYmV0d2VlbiA9IG1haW5ncm91cCwKICB0eXBlID0gMwopWyJBTk9WQSJdCgojICMgS1cgTm9uLXBhcmFtZXRyaWMgdGVzdCAobGlrZSBvbmUtd2F5IEFOT1ZBKQojIGtydXNrYWwudGVzdChnaXN0IH4gbWFpbmdyb3VwLCBkYXRhID0gYXMubWF0cml4KGZpbHRlcihwYXJ0aWNpcGFudF9kYXRhLCBkaXJlY3Rpb24gPT0gImZvcndhcmQiKSkpCiMgCiMgIyBDaGkgU3EKIyBnaXN0X2NoaXNxX2Z3IDwtIHBhcnRpY2lwYW50X2RhdGEgJT4lCiMgICB1bmdyb3VwKCkgJT4lCiMgICBmaWx0ZXIoZGlyZWN0aW9uID09ICJmb3J3YXJkIikgJT4lCiMgICBzZWxlY3QobWFpbmdyb3VwLCBnaXN0KSAlPiUKIyAgIGdyb3VwX2J5KG1haW5ncm91cCwgZ2lzdCkgJT4lCiMgICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JQojICAgc3ByZWFkKGdpc3QsIGNvdW50KSAlPiUKIyAgIHJlbmFtZShub25lID0gIjAiLAojICAgICAgICAgIG9uZSA9ICIwLjUiLAojICAgICAgICAgIGJvdGggPSAiMSIpCiMgCiMgZ2lzdF9jaGlzcV9md1tpcy5uYShnaXN0X2NoaXNxX2Z3KV0gPC0gMEwKIyBnaXN0X2NoaXNxX2Z3IDwtIGNiaW5kKGdpc3RfY2hpc3FfZndbLCJub25lIl0sIGdpc3RfY2hpc3FfZndbLCJvbmUiXSwgZ2lzdF9jaGlzcV9md1ssImJvdGgiXSkKIyBjaGlzcS50ZXN0KGdpc3RfY2hpc3FfZncpCmBgYAoKMy4gQU5PVkEgd2l0aCBmYWN0b3IgTWFpbkdyb3VwLCBmb3IgUmV2ZXJzZSBvbmx5LiAqSW4gdGhlIGNvZGUgaXMgYSBLcnVza2FsLVdhbGxpcyB0ZXN0LiBBbmQgQ2hpLVNxIHRvby4qCgpgYGB7ciBnaXN0IGFub3ZhMywgZWNobz1UUlVFLCByZXN1bHRzID0gJ21hcmt1cCd9CiMgIyBHaXN0IEFOT1ZBIDMKIyBnaXN0X2FvdjMgPC0gYW92KGdpc3QgfiBtYWluZ3JvdXAsIGRhdGEgPSBmaWx0ZXIocGFydGljaXBhbnRfZGF0YSwgZGlyZWN0aW9uID09ICJyZXZlcnNlZCIpKQojIHN1bW1hcnkoZ2lzdF9hb3YzKQojIGdpc3RfbHNkMyA8LSBMU0QudGVzdChnaXN0X2FvdjMsICJtYWluZ3JvdXAiLCBncm91cCA9IEZBTFNFKQojIGdpc3RfbHNkMyRjb21wYXJpc29uIAoKZXpBTk9WQSgKICBkYXRhID0gZmlsdGVyKHBhcnRpY2lwYW50X2RhdGEsIGRpcmVjdGlvbiA9PSAicmV2ZXJzZWQiKSwKICBkdiA9IGdpc3QsCiAgd2lkID0gaWQsCiAgYmV0d2VlbiA9IG1haW5ncm91cCwKICB0eXBlID0gMwopWyJBTk9WQSJdCgojICMgS1cgTm9uLXBhcmFtZXRyaWMgdGVzdCAobGlrZSBvbmUtd2F5IEFOT1ZBKQojIGtydXNrYWwudGVzdChnaXN0IH4gbWFpbmdyb3VwLCBkYXRhID0gYXMubWF0cml4KGZpbHRlcihwYXJ0aWNpcGFudF9kYXRhLCBkaXJlY3Rpb24gPT0gInJldmVyc2VkIikpKQojIAojICMgQ2hpIFNxCiMgZ2lzdF9jaGlzcV9ydiA8LSBwYXJ0aWNpcGFudF9kYXRhICU+JQojICAgdW5ncm91cCgpICU+JQojICAgZmlsdGVyKGRpcmVjdGlvbiA9PSAicmV2ZXJzZWQiKSAlPiUKIyAgIHNlbGVjdChtYWluZ3JvdXAsIGdpc3QpICU+JQojICAgZ3JvdXBfYnkobWFpbmdyb3VwLCBnaXN0KSAlPiUKIyAgIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lCiMgICBzcHJlYWQoZ2lzdCwgY291bnQpICU+JQojICAgcmVuYW1lKG5vbmUgPSAiMCIsCiMgICAgICAgICAgb25lID0gIjAuNSIsCiMgICAgICAgICAgYm90aCA9ICIxIikKIyAKIyBnaXN0X2NoaXNxX3J2W2lzLm5hKGdpc3RfY2hpc3FfcnYpXSA8LSAwTAojIGdpc3RfY2hpc3FfcnYgPC0gY2JpbmQoZ2lzdF9jaGlzcV9ydlssIm5vbmUiXSwgZ2lzdF9jaGlzcV9ydlssIm9uZSJdLCBnaXN0X2NoaXNxX3J2WywiYm90aCJdKQojIGNoaXNxLnRlc3QoZ2lzdF9jaGlzcV9ydikKYGBgCgojIyBMZXhpY2FsIFJlY2FsbCBBTk9WQXMKCjEuIEFOT1ZBIHdpdGggZmFjdG9ycyBNYWluR3JvdXAgJiBEaXJlY3Rpb24uCgpgYGB7ciBhY2MgYW5vdmExLCBlY2hvPVRSVUUsIHJlc3VsdHMgPSAnbWFya3VwJ30KIyAjIExleGljYWwgUmVjYWxsIEFOT1ZBIDEKIyBhY2NfYW92MSA8LSBhb3YoYWNjIH4gbWFpbmdyb3VwICogZGlyZWN0aW9uLCBkYXRhID0gcGFydGljaXBhbnRfZGF0YSkKIyBzdW1tYXJ5KGFjY19hb3YxKQojIGFjY19sc2QxIDwtIExTRC50ZXN0KGFjY19hb3YxLCAibWFpbmdyb3VwIiwgZ3JvdXAgPSBGQUxTRSkKIyBhY2NfbHNkMSRjb21wYXJpc29uCgplekFOT1ZBKAogIGRhdGEgPSBwYXJ0aWNpcGFudF9kYXRhLAogIGR2ID0gYWNjLAogIHdpZCA9IGlkLAogIHdpdGhpbiA9IGRpcmVjdGlvbiwKICBiZXR3ZWVuID0gbWFpbmdyb3VwLAogIHR5cGUgPSAzCilbIkFOT1ZBIl0KYGBgCgoyLiBBTk9WQSB3aXRoIGZhY3RvciBNYWluR3JvdXAsIGZvciBGb3J3YXJkIG9ubHkuCgpgYGB7ciBhY2MgYW5vdmEyLCBlY2hvPVRSVUUsIHJlc3VsdHMgPSAnbWFya3VwJ30KIyAjIExleGljYWwgUmVjYWxsIEFOT1ZBIDIKIyBhY2NfYW92MiA8LSBhb3YoYWNjIH4gbWFpbmdyb3VwLCBkYXRhID0gZmlsdGVyKHBhcnRpY2lwYW50X2RhdGEsIGRpcmVjdGlvbiA9PSAiZm9yd2FyZCIpKQojIHN1bW1hcnkoYWNjX2FvdjIpCiMgYWNjX2xzZDIgPC0gTFNELnRlc3QoYWNjX2FvdjIsICJtYWluZ3JvdXAiLCBncm91cCA9IEZBTFNFKQojIGFjY19sc2QyJGNvbXBhcmlzb24KCmV6QU5PVkEoCiAgZGF0YSA9IGZpbHRlcihwYXJ0aWNpcGFudF9kYXRhLCBkaXJlY3Rpb24gPT0gImZvcndhcmQiKSwKICBkdiA9IGFjYywKICB3aWQgPSBpZCwKICBiZXR3ZWVuID0gbWFpbmdyb3VwLAogIHR5cGUgPSAzCilbIkFOT1ZBIl0KYGBgCgozLiBBTk9WQSB3aXRoIGZhY3RvciBNYWluR3JvdXAsIGZvciBSZXZlcnNlIG9ubHkuIAoKYGBge3IgYWNjIGFub3ZhMywgZWNobz1UUlVFLCByZXN1bHRzID0gJ21hcmt1cCd9CiMgIyBMZXhpY2FsIFJlY2FsbCBBTk9WQSAzCiMgYWNjX2FvdjMgPC0gYW92KGFjYyB+IG1haW5ncm91cCwgZGF0YSA9IGZpbHRlcihwYXJ0aWNpcGFudF9kYXRhLCBkaXJlY3Rpb24gPT0gInJldmVyc2VkIikpCiMgc3VtbWFyeShhY2NfYW92MykKIyBhY2NfbHNkMyA8LSBMU0QudGVzdChhY2NfYW92MywgIm1haW5ncm91cCIsIGdyb3VwID0gRkFMU0UpCiMgYWNjX2xzZDMkY29tcGFyaXNvbgoKZXpBTk9WQSgKICBkYXRhID0gZmlsdGVyKHBhcnRpY2lwYW50X2RhdGEsIGRpcmVjdGlvbiA9PSAicmV2ZXJzZWQiKSwKICBkdiA9IGFjYywKICB3aWQgPSBpZCwKICBiZXR3ZWVuID0gbWFpbmdyb3VwLAogIHR5cGUgPSAzCilbIkFOT1ZBIl0KYGBgCgojIEFvQSBDb3JyZWxhdGlvbnMKCk5leHQsIHdlIHdhbnQgdG8gbG9vayBhdCBjb3JyZWxhdGlvbnMgYmV0d2VlbiBBb0EgYW5kIEdpc3QsIGFuZCBiZXR3ZW4gQW9BIGFuZCBMZXhpY2FsIFJlY2FsbC4gUmFpbiBhc2tlZCBmb3IgZm9yd2FyZCBhbmQgcmV2ZXJzZWQgc2VwYXJhdGVseSAoMSkgZGVhZiBvbmx5LCAoMikgaGVhcmluZyBvbmx5LCBhbmQgKDMpIGJvdGguIExldCdzIG1ha2UgaXQgd29yay4gCgpgYGB7ciByZXBhY2thZ2UgZGF0YSBmb3IgY29ycmVsYXRpb25zLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIExldCdzIG1ha2UgcGFydGljaXBhbnQtbGV2ZWwgZGF0YSwgYW5kIGhhdmUgZm9yd2FyZC9yZXZlcnNlZCBpbiBzZXBhcmF0ZSBjb2x1bW5zCmxleGdpc3RfZGF0YSA8LSBmdWxsZGF0YSAlPiUKICBncm91cF9ieShtYWluZ3JvdXAsIHBhcnRpY2lwYW50LCBkaXJlY3Rpb24pICU+JQogIG11dGF0ZShnaXN0ID0gbWVhbihnaXN0LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBsZXggPSBtZWFuKGFjYywgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdChtYWluZ3JvdXAsIHBhcnRpY2lwYW50LCBoZWFyaW5nLCBkaXJlY3Rpb24sIGFvYXNsLCBzaWdueXJzLCBhZ2UsIGdpc3QsIGxleCkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBnYXRoZXIobWV0cmljLCB2YWx1ZSwgZ2lzdDpsZXgpICU+JQogIHVuaXRlKG1ldHJpY3ZhbHVlLCBjKG1ldHJpYywgZGlyZWN0aW9uKSwgc2VwID0gIl8iKSAlPiUKICBzcHJlYWQobWV0cmljdmFsdWUsIHZhbHVlKSAlPiUKICBzZWxlY3QoLXBhcnRpY2lwYW50LCAtbWFpbmdyb3VwKQoKbGV4Z2lzdF9kZWFmIDwtIGxleGdpc3RfZGF0YSAlPiUgZmlsdGVyKGhlYXJpbmcgPT0gIkRlYWYiKSAlPiUgc2VsZWN0KC1oZWFyaW5nKQpsZXhnaXN0X2hlYXJpbmcgPC0gbGV4Z2lzdF9kYXRhICU+JSBmaWx0ZXIoaGVhcmluZyA9PSAiSGVhcmluZyIpICU+JSBzZWxlY3QoLWhlYXJpbmcpCmxleGdpc3RfYWxsIDwtIGxleGdpc3RfZGF0YSAlPiUgc2VsZWN0KC1oZWFyaW5nKQoKIyBMb2FkIGF3ZXNvbWUgZnVuY3Rpb24gdG8gbWFrZSBjb3JyZWxhdGlvbiB0YWJsZXMgd2l0aCBzdGFycyBmb3Igc2lnbmlmaWNhbmNlCiMgRnJvbTogaHR0cHM6Ly9teW93ZWx0LmJsb2dzcG90LmNvLnVrLzIwMDgvMDQvYmVhdXRpZnVsLWNvcnJlbGF0aW9uLXRhYmxlcy1pbi1yLmh0bWwKY29yc3RhcnNsIDwtIGZ1bmN0aW9uKHgpeyAKcmVxdWlyZShIbWlzYykgCnggPC0gYXMubWF0cml4KHgpIApSIDwtIEhtaXNjOjpyY29ycih4KSRyIApwIDwtIEhtaXNjOjpyY29ycih4KSRQIAojIyBkZWZpbmUgbm90aW9ucyBmb3Igc2lnbmlmaWNhbmNlIGxldmVsczsgc3BhY2luZyBpcyBpbXBvcnRhbnQuCm15c3RhcnMgPC0gaWZlbHNlKHAgPCAuMDAxLCAiKioqIiwgaWZlbHNlKHAgPCAuMDEsICIqKiAiLCBpZmVsc2UocCA8IC4wNSwgIiogIiwgIiAiKSkpCiMjIHRydW5jdHVhdGUgdGhlIG1hdHJpeCB0aGF0IGhvbGRzIHRoZSBjb3JyZWxhdGlvbnMgdG8gdHdvIGRlY2ltYWwKUiA8LSBmb3JtYXQocm91bmQoY2JpbmQocmVwKC0xLjExLCBuY29sKHgpKSwgUiksIDIpKVssLTFdIAojIyBidWlsZCBhIG5ldyBtYXRyaXggdGhhdCBpbmNsdWRlcyB0aGUgY29ycmVsYXRpb25zIHdpdGggdGhlaXIgYXByb3ByaWF0ZSBzdGFycyAKUm5ldyA8LSBtYXRyaXgocGFzdGUoUiwgbXlzdGFycywgc2VwPSIiKSwgbmNvbD1uY29sKHgpKSAKZGlhZyhSbmV3KSA8LSBwYXN0ZShkaWFnKFIpLCAiICIsIHNlcD0iIikgCnJvd25hbWVzKFJuZXcpIDwtIGNvbG5hbWVzKHgpIApjb2xuYW1lcyhSbmV3KSA8LSBwYXN0ZShjb2xuYW1lcyh4KSwgIiIsIHNlcD0iIikgCiMjIHJlbW92ZSB1cHBlciB0cmlhbmdsZQpSbmV3IDwtIGFzLm1hdHJpeChSbmV3KQpSbmV3W3VwcGVyLnRyaShSbmV3LCBkaWFnID0gVFJVRSldIDwtICIiClJuZXcgPC0gYXMuZGF0YS5mcmFtZShSbmV3KSAKIyMgcmVtb3ZlIGxhc3QgY29sdW1uIGFuZCByZXR1cm4gdGhlIG1hdHJpeCAod2hpY2ggaXMgbm93IGEgZGF0YSBmcmFtZSkKUm5ldyA8LSBjYmluZChSbmV3WzE6bGVuZ3RoKFJuZXcpLTFdKQpyZXR1cm4oUm5ldykgCn0KCiMgQ29ycmVsYXRpb25zIGZvciBEZWFmCnByaW50KCJERUFGIENvcnJlbGF0aW9ucyAtIFBlYXJzb24ncyByIikKI2NvcnN0YXJzbChsZXhnaXN0X2RlYWYpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgobGV4Z2lzdF9kZWFmKSkkcgpwcmludCgiREVBRiBDb3JyZWxhdGlvbnMgLSBQLXZhbHVlcyIpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgobGV4Z2lzdF9kZWFmKSkkUApjYXQocGFzdGUoIiIsIlxuIiwiIikpCgojIENvcnJlbGF0aW9ucyBmb3IgSGVhcmluZwpwcmludCgiSEVBUklORyBDb3JyZWxhdGlvbnMgLSBQZWFyc29uJ3MgciIpCiNjb3JzdGFyc2wobGV4Z2lzdF9oZWFyaW5nKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KGxleGdpc3RfaGVhcmluZykpJHIKcHJpbnQoIkhFQVJJTkcgQ29ycmVsYXRpb25zIC0gUC12YWx1ZXMiKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KGxleGdpc3RfaGVhcmluZykpJFAKY2F0KHBhc3RlKCIiLCJcbiIsIiIpKQoKIyBDb3JyZWxhdGlvbnMgZm9yIEFsbApwcmludCgiQUxMIENvcnJlbGF0aW9ucyAtIFBlYXJzb24ncyByIikKI2NvcnN0YXJzbChsZXhnaXN0X2FsbCkKSG1pc2M6OnJjb3JyKGFzLm1hdHJpeChsZXhnaXN0X2FsbCkpJHIKcHJpbnQoIkFMTCBDb3JyZWxhdGlvbnMgLSBQLXZhbHVlcyIpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgobGV4Z2lzdF9hbGwpKSRQCgpgYGAKCkknbSBhbHNvIGluY2x1ZGluZyBuaWNlbHkgZm9ybWF0dGVkIHRhYmxlcyB3aXRoICoqKiBpbmRpY2F0b3JzIG9mIHNpZ25pZmljYW5jZSBmb3IgcXVpY2sgcmVmZXJlbmNpbmcuIE9yZGVyOiBEZWFmLCBIZWFyaW5nLCBBbGwuIAoKYGBge3IgcHJldHR5IGNvcnJlbGF0aW9uc30KY29yc3RhcnNsKGxleGdpc3RfZGVhZikKY29yc3RhcnNsKGxleGdpc3RfaGVhcmluZykKY29yc3RhcnNsKGxleGdpc3RfYWxsKQpgYGAKCiMjIFNjYXR0ZXJwbG90IG9mIENvcnJlbGF0aW9ucwpMZXQncyB2aXN1YWxpemUgd2hhdCdzIGhhcHBlbmluZyB3aXRoIHRoZSBjb3JyZWxhdGlvbnMgaGVyZS4gCmBgYHtyIGNvcnJlbGF0aW9uIGNoYXJ0cywgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3BhaXJzKGxleGdpc3RfZGF0YSwgY29sdW1ucyA9IGMoMjo4KSwgYWVzKGNvbG9yID0gaGVhcmluZykpCmBgYAoKCiMgRXllIEdhemUgRGF0YQoKTm93IGV5ZSBnYXplIGRhdGEuIEJveHBsb3RzIGZpcnN0LiBBbHNvIGhlcmUsIHdlJ3JlIHJlbmFtaW5nICJjaGluIiB0byAibmVjayIgYmVjYXVzZSB0aGF0J3Mgd2hhdCBpdCBhY3R1YWxseSBpcyEgQnV0IHdlIGFsc28gaGF2ZSB0byBmaXggYWxsIE5BJ3MgaW4gdGhlIHBlcmNlbnRhZ2VzIHRvIHplcm9zLCBiZWN1YXNlIHRoYXQncyB3aGF0IHRoZXkgYWN0dWFsbHkgYXJlLiAKYGBge3IgZXllIGdhemUgYm94cGxvdH0KIyByZW5hbWUgY2hpbiB0byBuZWNrCmZ1bGxkYXRhIDwtIGZ1bGxkYXRhICU+JQogIHJlbmFtZShuZWNrID0gY2hpbikgJT4lCiAgZ2F0aGVyKGFvaSwgcGVyY2VudCwgYmVsbHk6dXBwZXJjaGVzdCkKCiMgRml4IGFsbCBOQSdzIGluIFBlcmNlbnQgY29sdW1uIHRvIDAKZml4cGVyY2VudCA8LSBmdWxsZGF0YSRwZXJjZW50CmZ1bGxkYXRhJHBlcmNlbnQgPC0gY29hbGVzY2UoZml4cGVyY2VudCwgMCkKZnVsbGRhdGEgPC0gZnVsbGRhdGEgJT4lCiAgc3ByZWFkKGFvaSwgcGVyY2VudCkKCmZ1bGxkYXRhICU+JQogIGZpbHRlcihleWVfZXhjbHVkZSA9PSBGQUxTRSkgJT4lCiAgc2VsZWN0KGRpcmVjdGlvbiwgYmVsbHk6dXBwZXJjaGVzdCkgJT4lCiAgZ2F0aGVyKGFvaSwgcGVyY2VudCwgYmVsbHk6dXBwZXJjaGVzdCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYW9pLCB5ID0gcGVyY2VudCwgZmlsbCA9IGRpcmVjdGlvbikpICsgZ2VvbV9ib3hwbG90KCkKYGBgCgpCdXQgbGV0J3MgdHJ5IGVycm9yIGNoYXJ0cyB0b28hIEluc3RlYWQgb2YgYm94cGxvdHMuCgpgYGB7ciBleWUgZ2F6ZSBlcnJvciBiYXIgY2hhcnR9CmZ1bGxkYXRhX2Vycm9yIDwtIGZ1bGxkYXRhICU+JQogIGZpbHRlcihleWVfZXhjbHVkZSA9PSBGQUxTRSkgJT4lCiAgZ2F0aGVyKGFvaSwgcGVyY2VudCwgYmVsbHk6dXBwZXJjaGVzdCkgJT4lCiAgZ3JvdXBfYnkoaWQsIGRpcmVjdGlvbiwgYW9pKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZ3JvdXBfYnkoZGlyZWN0aW9uLCBhb2kpICU+JQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihwZXJjZW50LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBzZCA9IHNkKHBlcmNlbnQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGNvdW50ID0gbigpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQoY291bnQpKQpmdWxsZGF0YV9lcnJvciRhb2kgPC0gZmN0X3JlbGV2ZWwoZnVsbGRhdGFfZXJyb3IkYW9pLCBjKCJmb3JlaGVhZCIsImV5ZXMiLCJtb3V0aCIsIm5lY2siLCJ1cHBlcmNoZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlkY2hlc3QiLCJsb3dlcmNoZXN0IiwiYmVsbHkiLCJsZWZ0IiwicmlnaHQiKSkKCmZ1bGxkYXRhX2Vycm9yICU+JQogIGdncGxvdChhZXMoeCA9IGFvaSwgeSA9IG1lYW4sIGZpbGwgPSBkaXJlY3Rpb24pKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbi1zZSwgeW1heCA9IG1lYW4rc2UpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHdpZHRoID0gMC41KSArCiAgbGFicyh0aXRsZSA9ICJFeWUgR2F6ZSBCZWhhdmlvciIsIHggPSAiIiwgeSA9ICJsb29raW5nIHRpbWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQsIGxpbWl0cyA9IGMoMCwuNzApKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKYGBgCgpBbmQgYSB0YWJsZSBvZiBleWUgZ2F6ZSByZXN1bHRzIHRvbwoKYGBge3IgZXllIGdhemUgZXJyb3IgdGFibGV9CmZ1bGxkYXRhX2dhemV0YWJsZSA8LSBmdWxsZGF0YSAlPiUKICBmaWx0ZXIoZXllX2V4Y2x1ZGUgPT0gRkFMU0UpICU+JQogIGdhdGhlcihhb2ksIHBlcmNlbnQsIGJlbGx5OnVwcGVyY2hlc3QpICU+JQogIGdyb3VwX2J5KGlkLCBtYWluZ3JvdXAsIGRpcmVjdGlvbiwgYW9pKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZ3JvdXBfYnkobWFpbmdyb3VwLCBkaXJlY3Rpb24sIGFvaSkgJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHBlcmNlbnQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNkID0gc2QocGVyY2VudCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgbXV0YXRlKG1lYW4gPSByb3VuZChtZWFuKjEwMCwxKSwKICAgICAgICAgc2QgPSByb3VuZChzZCoxMDAsMSkpICU+JQogIG11dGF0ZSh2YWx1ZSA9IHBhc3RlKG1lYW4sIHNkLCBzZXAgPSAiIMKxICIpKSAlPiUKICBtdXRhdGUodmFsdWUgPSBwYXN0ZSh2YWx1ZSwgIiUiLCBzZXAgPSAiIikpCgpmdWxsZGF0YV9nYXpldGFibGUkYW9pIDwtIGZjdF9yZWxldmVsKGZ1bGxkYXRhX2dhemV0YWJsZSRhb2ksIGMoImZvcmVoZWFkIiwiZXllcyIsIm1vdXRoIiwibmVjayIsInVwcGVyY2hlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaWRjaGVzdCIsImxvd2VyY2hlc3QiLCJiZWxseSIsImxlZnQiLCJyaWdodCIpKQoKZnVsbGRhdGFfZ2F6ZXRhYmxlICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KC1tZWFuLCAtc2QpICU+JSAKICBzcHJlYWQoYW9pLCB2YWx1ZSkKCmZ1bGxkYXRhX3RvdGFsIDwtIGZ1bGxkYXRhICU+JQogIGZpbHRlcihleWVfZXhjbHVkZSA9PSBGQUxTRSkgJT4lCiAgZ2F0aGVyKGFvaSwgcGVyY2VudCwgYmVsbHk6dXBwZXJjaGVzdCkgJT4lCiAgZ3JvdXBfYnkoYW9pKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgc3ByZWFkKGFvaSwgcGVyY2VudCkKCiNzdW0oZnVsbGRhdGFfdG90YWwkZXllcywgZnVsbGRhdGFfdG90YWwkbW91dGgsIGZ1bGxkYXRhX3RvdGFsJG5lY2spCiNmdWxsZGF0YV90b3RhbCRsZWZ0CiNmdWxsZGF0YV90b3RhbCRyaWdodApgYGAKIyMgQmlnIFRocmVlLVdheSBBTk9WQQpOb3cgd2UncmUgZ29pbmcgdG8gdHJ5IGEgdGhyZWUtd2F5IEdyb3VwIHggRGlyZWN0aW9uIHggQU9JIEFOT1ZBIHdpdGggdGhlIHRvcCAzIEFPSXMgKEV5ZXMsIE1vdXRoLCBOZWNrKQoKYGBge3IgYmlnIGFub3ZhIGFvaTMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9Im1hcmt1cCJ9CmFvaTMgPC0gYygnZXllcycsJ21vdXRoJywnbmVjaycpCgojIE9yZ2FuaXplIHRoZSBkYXRhIGJ5IHRob3NlIEFPSXMgKGJ1dCBhZ2FpbiB3ZSBuZWVkIHBhcnRpY2lwYW50LWxldmVsIGZpcnN0KQphb2kzX2RhdGEgPC0gZnVsbGRhdGEgJT4lCiAgZmlsdGVyKGV5ZV9leGNsdWRlID09IEZBTFNFKSAlPiUKICBzZWxlY3QoaWQsIG1haW5ncm91cCwgaGVhcmluZywgYW9hc2wsIGFnZSwgZGlyZWN0aW9uLCBiZWxseTp1cHBlcmNoZXN0KSAlPiUKICBnYXRoZXIoYW9pLCBwZXJjZW50LCBiZWxseTp1cHBlcmNoZXN0KSAlPiUKICBncm91cF9ieShpZCwgZGlyZWN0aW9uLCBhb2kpICU+JQogIG11dGF0ZShwZXJjZW50ID0gbWVhbihwZXJjZW50LCBuYS5ybSA9IFRSVUUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBmaWx0ZXIoYW9pICVpbiUgYW9pMykgJT4lCiAgc3ByZWFkKGFvaSwgcGVyY2VudCkKCiMgIyBMaW1pdCB0byBleWVzIG1vdXRoIG5lY2sKIyBiaWdfYW92X2FvaTMgPC0gYW9pM19kYXRhICU+JQojICAgZ2F0aGVyKGFvaSwgcGVyY2VudCwgZXllczpuZWNrKSAlPiUKIyAgIGFvdihwZXJjZW50IH4gbWFpbmdyb3VwICogZGlyZWN0aW9uICogYW9pLCBkYXRhID0gLikKIyAKIyBzdW1tYXJ5KGJpZ19hb3ZfYW9pMykKIyAKIyBiaWdfYW92X2FvaTNfbHNkIDwtIExTRC50ZXN0KGJpZ19hb3ZfYW9pMywgImFvaSIsIGdyb3VwID0gRkFMU0UpCiMgYmlnX2Fvdl9hb2kzX2xzZCRjb21wYXJpc29uCgphb2kzX2RhdGFfZ2F0aGVyIDwtIGFvaTNfZGF0YSAlPiUKICBnYXRoZXIoYW9pLCBwZXJjZW50LCBleWVzOm5lY2spICU+JQogIGZpbHRlcihpZCAhPSAiNiIpCgpiaWczX2FvdiA8LSBlekFOT1ZBKAogIGRhdGEgPSBhb2kzX2RhdGFfZ2F0aGVyLAogIGR2ID0gcGVyY2VudCwKICB3aWQgPSBpZCwKICB3aXRoaW4gPSAuKGRpcmVjdGlvbiwgYW9pKSwKICBiZXR3ZWVuID0gbWFpbmdyb3VwLAogIHR5cGUgPSAzCilbIkFOT1ZBIl0KCnByaW50KGJpZzNfYW92WyJBTk9WQSJdKQpgYGAKIyMgTGVmdCBWcyBSaWdodApgYGB7ciBsZWZ0IHJpZ2h0IGFub3ZhLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSJtYXJrdXAifQphb2kzIDwtIGMoJ2xlZnQnLCdyaWdodCcpCgojIE9yZ2FuaXplIHRoZSBkYXRhIGJ5IHRob3NlIEFPSXMgKGJ1dCBhZ2FpbiB3ZSBuZWVkIHBhcnRpY2lwYW50LWxldmVsIGZpcnN0KQphb2lMUl9kYXRhIDwtIGZ1bGxkYXRhICU+JQogIGZpbHRlcihleWVfZXhjbHVkZSA9PSBGQUxTRSkgJT4lCiAgc2VsZWN0KGlkLCBtYWluZ3JvdXAsIGhlYXJpbmcsIGFvYXNsLCBhZ2UsIGRpcmVjdGlvbiwgYmVsbHk6dXBwZXJjaGVzdCkgJT4lCiAgZ2F0aGVyKGFvaSwgcGVyY2VudCwgYmVsbHk6dXBwZXJjaGVzdCkgJT4lCiAgZ3JvdXBfYnkoaWQsIGFvaSkgJT4lCiAgbXV0YXRlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGZpbHRlcihhb2kgJWluJSBhb2kzKSAlPiUKICBzcHJlYWQoYW9pLCBwZXJjZW50KQoKYW9pTFJfZGF0YV9nYXRoZXIgPC0gYW9pTFJfZGF0YSAlPiUKICBnYXRoZXIoYW9pLCBwZXJjZW50LCBsZWZ0OnJpZ2h0KSAlPiUKICBmaWx0ZXIoaWQgIT0gIjYiKQoKYmlnTFJfYW92IDwtIGV6QU5PVkEoCiAgZGF0YSA9IGFvaUxSX2RhdGFfZ2F0aGVyLAogIGR2ID0gcGVyY2VudCwKICB3aWQgPSBpZCwKICB3aXRoaW4gPSBhb2ksCiAgYmV0d2VlbiA9IG1haW5ncm91cCwKICB0eXBlID0gMwopWyJBTk9WQSJdCgpwcmludChiaWdMUl9hb3ZbIkFOT1ZBIl0pCmBgYAoKIyMgSW50ZXJhY3Rpb25zIFZpc3VhbGl6YXRpb24KU28gd2UgaGF2ZSBzaWduaWZpY2FudCBtYWluZ3JvdXA6YW9pIGFuZCBkaXJlY3Rpb246YW9pIGludGVyYWN0aW9ucy4gTGV0J3MgdHJ5IHRvIHZpc3VhbGl6ZSB3aGF0IGNhbiBiZSBkcml2aW5nIHRoZXNlLiBXZSBjYW4gZ28gYmFjayB0byB0aGUgU0VNIGNoYXJ0IGJ1dCBicmVhayBpdCBkb3duLi4uCgpGaXJzdCBhcmUgdGhlIG1haW5ncm91cDphb2kgY2hhcnRzICpUaGUgZXJyb3IgYmFycyBhcmUgbm90IDEwMCUgYWNjdXJhdGUsIEkgdG9vayBhIHF1aWNrLW4tZWFzeSB3YXkgYXJvdW5kKgoKYGBge3J9CmFvaTNfaW50ZXJhY3Rpb25zX21haW5ncm91cGFvaSA8LSBmdWxsZGF0YSAlPiUKICBmaWx0ZXIoZXllX2V4Y2x1ZGUgPT0gRkFMU0UpICU+JQogIHNlbGVjdChpZCwgcGFydGljaXBhbnQsIG1haW5ncm91cCwgZGlyZWN0aW9uLCBleWVzLCBtb3V0aCwgbmVjaykgJT4lCiAgZ2F0aGVyKGFvaSwgcGVyY2VudCwgYyhleWVzLCBtb3V0aCwgbmVjaykpICU+JQogIGdyb3VwX2J5KGlkLCBtYWluZ3JvdXAsIGRpcmVjdGlvbiwgYW9pKSAlPiUKICBtdXRhdGUocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBncm91cF9ieShtYWluZ3JvdXAsIGFvaSkgJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHBlcmNlbnQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNkID0gc2QocGVyY2VudCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgY291bnQgPSBuKCkvMiwKICAgICAgICAgICAgc2UgPSBzZC9zcXJ0KGNvdW50KSkKIyBJIG5lZWQgdG8gZmlyc3QgY29sbGFwc2UgYWNyb3NzIHN0b3JpZXMgZm9yIGVhY2ggcGFydGljaXBhbnQuLi5oZXJlIEkgZGlkbid0LiBNdXN0IGZpeCBsYXRlci4KCmFvaTNfaW50ZXJhY3Rpb25zX21haW5ncm91cGFvaSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gYW9pLCB5ID0gbWVhbiwgZmlsbCA9IG1haW5ncm91cCkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuLXNlLCB5bWF4ID0gbWVhbitzZSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgd2lkdGggPSAwLjUpICsKICBsYWJzKHRpdGxlID0gIk1haW5Hcm91cCAmIEFPSSBJbnRlcmFjdGlvbiAxIiwgc3VidGl0bGUgPSAiRXJyb3IgYmFycyByZXByZXNlbnQgU0UiLCB4ID0gIiIsIHkgPSAicGVyY2VudCBsb29raW5nIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KQoKYW9pM19pbnRlcmFjdGlvbnNfbWFpbmdyb3VwYW9pICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBtYWluZ3JvdXAsIHkgPSBtZWFuLCBmaWxsID0gYW9pKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW4tc2UsIHltYXggPSBtZWFuK3NlKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCB3aWR0aCA9IDAuNSkgKwogIGxhYnModGl0bGUgPSAiTWFpbkdyb3VwICYgQU9JIEludGVyYWN0aW9uIDIiLCBzdWJ0aXRsZSA9ICJFcnJvciBiYXJzIHJlcHJlc2VudCBTRSIsIHggPSAiIiwgeSA9ICJwZXJjZW50IGxvb2tpbmciKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpCgoKYGBgCgpGaXJzdCBhcmUgdGhlIGRpcmVjdGlvbjphb2kgY2hhcnRzICpUaGUgZXJyb3IgYmFycyBhcmUgbm90IDEwMCUgYWNjdXJhdGUsIEkgdG9vayBhIHF1aWNrLW4tZWFzeSB3YXkgYXJvdW5kKgoKYGBge3J9CmFvaTNfaW50ZXJhY3Rpb25zX2RpcmVjdGlvbmFvaSA8LSBmdWxsZGF0YSAlPiUKICBmaWx0ZXIoZXllX2V4Y2x1ZGUgPT0gRkFMU0UpICU+JQogIHNlbGVjdChpZCwgcGFydGljaXBhbnQsIG1haW5ncm91cCwgZGlyZWN0aW9uLCBleWVzLCBtb3V0aCwgbmVjaykgJT4lCiAgZ2F0aGVyKGFvaSwgcGVyY2VudCwgYyhleWVzLCBtb3V0aCwgbmVjaykpICU+JQogIGdyb3VwX2J5KGlkLCBtYWluZ3JvdXAsIGRpcmVjdGlvbiwgYW9pKSAlPiUKICBtdXRhdGUocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBncm91cF9ieShkaXJlY3Rpb24sIGFvaSkgJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHBlcmNlbnQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNkID0gc2QocGVyY2VudCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgY291bnQgPSBuKCksCiAgICAgICAgICAgIHNlID0gc2Qvc3FydChjb3VudCkpCiMgSSBuZWVkIHRvIGZpcnN0IGNvbGxhcHNlIGFjcm9zcyBzdG9yaWVzIGZvciBlYWNoIHBhcnRpY2lwYW50Li4uaGVyZSBJIGRpZG4ndC4gTXVzdCBmaXggbGF0ZXIuCgphb2kzX2ludGVyYWN0aW9uc19kaXJlY3Rpb25hb2kgJT4lIAogIGdncGxvdChhZXMoeCA9IGFvaSwgeSA9IG1lYW4sIGZpbGwgPSBkaXJlY3Rpb24pKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbi1zZSwgeW1heCA9IG1lYW4rc2UpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHdpZHRoID0gMC41KSArCiAgbGFicyh0aXRsZSA9ICJNYWluR3JvdXAgJiBEaXJlY3Rpb24gSW50ZXJhY3Rpb24gMSIsIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgcmVwcmVzZW50IFNFIiwgeCA9ICIiLCB5ID0gInBlcmNlbnQgbG9va2luZyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCkKCmFvaTNfaW50ZXJhY3Rpb25zX2RpcmVjdGlvbmFvaSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZGlyZWN0aW9uLCB5ID0gbWVhbiwgZmlsbCA9IGFvaSkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuLXNlLCB5bWF4ID0gbWVhbitzZSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgd2lkdGggPSAwLjUpICsKICBsYWJzKHRpdGxlID0gIk1haW5Hcm91cCAmIERpcmVjdGlvbiBJbnRlcmFjdGlvbiAyIiwgc3VidGl0bGUgPSAiRXJyb3IgYmFycyByZXByZXNlbnQgU0UiLCB4ID0gIiIsIHkgPSAicGVyY2VudCBsb29raW5nIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KQpgYGAKCgojIyBBbGwgdGhlIEFPSSBtZWFucwpMZXQncyBnZXQgdGFibGVzIG9mIG91ciBtZWFucyBoZXJlLCBpbiB2YXJpb3VzIGNvbmZpZ3VyYXRpb25zCgpgYGB7ciBhb2kgcmF3LCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAnbWFya3VwJ30KYW9pM19kYXRhICU+JQogIGdyb3VwX2J5KG1haW5ncm91cCwgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoZXllcyA9IG1lYW4oZXllcywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbW91dGggPSBtZWFuKG1vdXRoLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBuZWNrID0gbWVhbihuZWNrLCBuYS5ybSA9IFRSVUUpKSAlPiUKICByb3d3aXNlKCkgJT4lCiAgbXV0YXRlKHRvdGFsID0gc3VtKGV5ZXMsbW91dGgsbmVjaykpCgphb2kzX2RhdGEgJT4lCiAgZ3JvdXBfYnkobWFpbmdyb3VwLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShleWVzID0gbWVhbihleWVzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtb3V0aCA9IG1lYW4obW91dGgsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG5lY2sgPSBtZWFuKG5lY2ssIG5hLnJtID0gVFJVRSkpICU+JQogIGdyb3VwX2J5KG1haW5ncm91cCkgJT4lCiAgc3VtbWFyaXNlKGV5ZXMgPSBtZWFuKGV5ZXMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1vdXRoID0gbWVhbihtb3V0aCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbmVjayA9IG1lYW4obmVjaywgbmEucm0gPSBUUlVFKSkgICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUodG90YWwgPSBzdW0oZXllcyxtb3V0aCxuZWNrKSkKCmFvaTNfZGF0YSAlPiUKICBncm91cF9ieShtYWluZ3JvdXAsIGRpcmVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGV5ZXMgPSBtZWFuKGV5ZXMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1vdXRoID0gbWVhbihtb3V0aCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbmVjayA9IG1lYW4obmVjaywgbmEucm0gPSBUUlVFKSkgJT4lCiAgZ3JvdXBfYnkoZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UoZXllcyA9IG1lYW4oZXllcywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbW91dGggPSBtZWFuKG1vdXRoLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBuZWNrID0gbWVhbihuZWNrLCBuYS5ybSA9IFRSVUUpKSAlPiUKICByb3d3aXNlKCkgJT4lCiAgbXV0YXRlKHRvdGFsID0gc3VtKGV5ZXMsbW91dGgsbmVjaykpCgphb2kzX2RhdGEgJT4lCiAgZ3JvdXBfYnkobWFpbmdyb3VwLCBkaXJlY3Rpb24pICU+JQogIHN1bW1hcmlzZShleWVzID0gbWVhbihleWVzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtb3V0aCA9IG1lYW4obW91dGgsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG5lY2sgPSBtZWFuKG5lY2ssIG5hLnJtID0gVFJVRSkpICU+JQogIGdyb3VwX2J5KG1haW5ncm91cCkgJT4lCiAgc3VtbWFyaXNlKGV5ZXMgPSBtZWFuKGV5ZXMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1vdXRoID0gbWVhbihtb3V0aCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbmVjayA9IG1lYW4obmVjaywgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBnYXRoZXIoYW9pLCBwZXJjZW50LCBleWVzOm5lY2spICU+JQogIGdyb3VwX2J5KGFvaSkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtID0gVFJVRSkpCmBgYAoKCiMjIEV5ZXMKCjEuIEFOT1ZBIHdpdGggZmFjdG9ycyBNYWluR3JvdXAgJiBEaXJlY3Rpb24uCgpgYGB7ciBleWVzIGFub3ZhMSwgZWNobz1GQUxTRSwgcmVzdWx0cyA9ICdtYXJrdXAnfQoKIyAjIGV5ZXMgQU5DT1ZBIDEKIyBleWVzX2FvdjEgPC0gYW92KGV5ZXMgfiBtYWluZ3JvdXAgKiBkaXJlY3Rpb24sIGRhdGEgPSBhb2kzX2RhdGEpCiMgc3VtbWFyeShleWVzX2FvdjEpCiMgIyBleWVzX2xzZDEgPC0gTFNELnRlc3QoZXllc19hb3YxLCAibWFpbmdyb3VwIiwgZ3JvdXAgPSBGQUxTRSkKIyAjIGV5ZXNfbHNkMSRjb21wYXJpc29uCgphb2kzX2RhdGEgPC0gZmlsdGVyKGFvaTNfZGF0YSwgaWQgIT0gIjYiKQplekFOT1ZBKAogIGRhdGEgPSBhb2kzX2RhdGEsCiAgZHYgPSBleWVzLAogIHdpZCA9IGlkLAogIHdpdGhpbiA9IGRpcmVjdGlvbiwKICBiZXR3ZWVuID0gbWFpbmdyb3VwLAogIHR5cGUgPSAzCilbIkFOT1ZBIl0KYGBgCgoyLiBBTk9WQSB3aXRoIGZhY3RvciBNYWluR3JvdXAsIGZvciBGb3J3YXJkIG9ubHkuCgpgYGB7ciBleWVzIGFub3ZhMiwgZWNobz1GQUxTRSwgcmVzdWx0cyA9ICdtYXJrdXAnfQojICMgZXllcyBBTk9WQSAyCiMgZXllc19hb3YyIDwtIGFvdihleWVzIH4gbWFpbmdyb3VwLCBkYXRhID0gZmlsdGVyKGFvaTNfZGF0YSwgZGlyZWN0aW9uID09ICJmb3J3YXJkIikpCiMgc3VtbWFyeShleWVzX2FvdjIpCiMgIyBleWVzX2xzZDIgPC0gTFNELnRlc3QoZXllc19hb3YyLCAibWFpbmdyb3VwIiwgZ3JvdXAgPSBGQUxTRSkKIyAjIGV5ZXNfbHNkMiRjb21wYXJpc29uCgplekFOT1ZBKAogIGRhdGEgPSBmaWx0ZXIoYW9pM19kYXRhLCBkaXJlY3Rpb24gPT0gImZvcndhcmQiKSwKICBkdiA9IGV5ZXMsCiAgd2lkID0gaWQsCiAgYmV0d2VlbiA9IG1haW5ncm91cCwKICB0eXBlID0gMwopWyJBTk9WQSJdCmBgYAoKMy4gQU5PVkEgd2l0aCBmYWN0b3IgTWFpbkdyb3VwLCBmb3IgUmV2ZXJzZSBvbmx5LiAKCmBgYHtyIGV5ZXMgYW5vdmEzLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gJ21hcmt1cCd9CiMgIyBleWVzIEFOT1ZBIDMKIyBleWVzX2FvdjMgPC0gYW92KGV5ZXMgfiBtYWluZ3JvdXAsIGRhdGEgPSBmaWx0ZXIoYW9pM19kYXRhLCBkaXJlY3Rpb24gPT0gInJldmVyc2VkIikpCiMgc3VtbWFyeShleWVzX2FvdjMpCiMgIyBleWVzX2xzZDMgPC0gTFNELnRlc3QoZXllc19hb3YzLCAibWFpbmdyb3VwIiwgZ3JvdXAgPSBGQUxTRSkKIyAjIGV5ZXNfbHNkMyRjb21wYXJpc29uCgplekFOT1ZBKAogIGRhdGEgPSBmaWx0ZXIoYW9pM19kYXRhLCBkaXJlY3Rpb24gPT0gInJldmVyc2VkIiksCiAgZHYgPSBleWVzLAogIHdpZCA9IGlkLAogIGJldHdlZW4gPSBtYWluZ3JvdXAsCiAgdHlwZSA9IDMKKVsiQU5PVkEiXQpgYGAKCiMjIE1vdXRoCgoxLiBBTk9WQSB3aXRoIGZhY3RvcnMgTWFpbkdyb3VwICYgRGlyZWN0aW9uLgoKYGBge3IgbW91dGggYW5vdmExLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gJ21hcmt1cCd9CgojICMgbW91dGggQU5DT1ZBIDEKIyBtb3V0aF9hb3YxIDwtIGFvdihtb3V0aCB+IG1haW5ncm91cCAqIGRpcmVjdGlvbiwgZGF0YSA9IGFvaTNfZGF0YSkKIyBzdW1tYXJ5KG1vdXRoX2FvdjEpCiMgbW91dGhfbHNkMSA8LSBMU0QudGVzdChtb3V0aF9hb3YxLCAibWFpbmdyb3VwIiwgZ3JvdXAgPSBGQUxTRSkKIyBtb3V0aF9sc2QxJGNvbXBhcmlzb24KCmV6QU5PVkEoCiAgZGF0YSA9IGFvaTNfZGF0YSwKICBkdiA9IG1vdXRoLAogIHdpZCA9IGlkLAogIHdpdGhpbiA9IGRpcmVjdGlvbiwKICBiZXR3ZWVuID0gbWFpbmdyb3VwLAogIHR5cGUgPSAzCilbIkFOT1ZBIl0KYGBgCgoyLiBBTk9WQSB3aXRoIGZhY3RvciBNYWluR3JvdXAsIGZvciBGb3J3YXJkIG9ubHkuCgpgYGB7ciBtb3V0aCBhbm92YTIsIGVjaG89RkFMU0UsIHJlc3VsdHMgPSAnbWFya3VwJ30KIyAjIG1vdXRoIEFOT1ZBIDIKIyBtb3V0aF9hb3YyIDwtIGFvdihtb3V0aCB+IG1haW5ncm91cCwgZGF0YSA9IGZpbHRlcihhb2kzX2RhdGEsIGRpcmVjdGlvbiA9PSAiZm9yd2FyZCIpKQojIHN1bW1hcnkobW91dGhfYW92MikKIyAjIG1vdXRoX2xzZDIgPC0gTFNELnRlc3QobW91dGhfYW92MiwgIm1haW5ncm91cCIsIGdyb3VwID0gRkFMU0UpCiMgIyBtb3V0aF9sc2QyJGNvbXBhcmlzb24KZXpBTk9WQSgKICBkYXRhID0gZmlsdGVyKGFvaTNfZGF0YSwgZGlyZWN0aW9uID09ICJmb3J3YXJkIiksCiAgZHYgPSBtb3V0aCwKICB3aWQgPSBpZCwKICBiZXR3ZWVuID0gbWFpbmdyb3VwLAogIHR5cGUgPSAzCilbIkFOT1ZBIl0KYGBgCgozLiBBTk9WQSB3aXRoIGZhY3RvciBNYWluR3JvdXAsIGZvciBSZXZlcnNlIG9ubHkuIAoKYGBge3IgbW91dGggYW5vdmEzLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gJ21hcmt1cCd9CiMgIyBtb3V0aCBBTk9WQSAzCiMgbW91dGhfYW92MyA8LSBhb3YobW91dGggfiBtYWluZ3JvdXAsIGRhdGEgPSBmaWx0ZXIoYW9pM19kYXRhLCBkaXJlY3Rpb24gPT0gInJldmVyc2VkIikpCiMgc3VtbWFyeShtb3V0aF9hb3YzKQojICMgbW91dGhfbHNkMyA8LSBMU0QudGVzdChtb3V0aF9hb3YzLCAibWFpbmdyb3VwIiwgZ3JvdXAgPSBGQUxTRSkKIyAjIG1vdXRoX2xzZDMkY29tcGFyaXNvbgplekFOT1ZBKAogIGRhdGEgPSBmaWx0ZXIoYW9pM19kYXRhLCBkaXJlY3Rpb24gPT0gInJldmVyc2VkIiksCiAgZHYgPSBtb3V0aCwKICB3aWQgPSBpZCwKICBiZXR3ZWVuID0gbWFpbmdyb3VwLAogIHR5cGUgPSAzCilbIkFOT1ZBIl0KYGBgCgojIyBOZWNrCgoxLiBBTk9WQSB3aXRoIGZhY3RvcnMgTWFpbkdyb3VwICYgRGlyZWN0aW9uLgoKYGBge3IgbmVjayBhbm92YTEsIGVjaG89RkFMU0UsIHJlc3VsdHMgPSAnbWFya3VwJ30KCiMgIyBuZWNrIEFOQ09WQSAxCiMgbmVja19hb3YxIDwtIGFvdihuZWNrIH4gbWFpbmdyb3VwICogZGlyZWN0aW9uLCBkYXRhID0gYW9pM19kYXRhKQojIHN1bW1hcnkobmVja19hb3YxKQojICMgbmVja19sc2QxIDwtIExTRC50ZXN0KG5lY2tfYW92MSwgIm1haW5ncm91cCIsIGdyb3VwID0gRkFMU0UpCiMgIyBuZWNrX2xzZDEkY29tcGFyaXNvbgoKZXpBTk9WQSgKICBkYXRhID0gYW9pM19kYXRhLAogIGR2ID0gbmVjaywKICB3aWQgPSBpZCwKICB3aXRoaW4gPSBkaXJlY3Rpb24sCiAgYmV0d2VlbiA9IG1haW5ncm91cCwKICB0eXBlID0gMwopWyJBTk9WQSJdCmBgYAoKMi4gQU5PVkEgd2l0aCBmYWN0b3IgTWFpbkdyb3VwLCBmb3IgRm9yd2FyZCBvbmx5LgoKYGBge3IgbmVjayBhbm92YTIsIGVjaG89RkFMU0UsIHJlc3VsdHMgPSAnbWFya3VwJ30KIyAjIG5lY2sgQU5PVkEgMgojIG5lY2tfYW92MiA8LSBhb3YobmVjayB+IG1haW5ncm91cCwgZGF0YSA9IGZpbHRlcihhb2kzX2RhdGEsIGRpcmVjdGlvbiA9PSAiZm9yd2FyZCIpKQojIHN1bW1hcnkobmVja19hb3YyKQojICMgbmVja19sc2QyIDwtIExTRC50ZXN0KG5lY2tfYW92MiwgIm1haW5ncm91cCIsIGdyb3VwID0gRkFMU0UpCiMgIyBuZWNrX2xzZDIkY29tcGFyaXNvbgplekFOT1ZBKAogIGRhdGEgPSBmaWx0ZXIoYW9pM19kYXRhLCBkaXJlY3Rpb24gPT0gImZvcndhcmQiKSwKICBkdiA9IG5lY2ssCiAgd2lkID0gaWQsCiAgYmV0d2VlbiA9IG1haW5ncm91cCwKICB0eXBlID0gMwopWyJBTk9WQSJdCmBgYAoKMy4gQU5PVkEgd2l0aCBmYWN0b3IgTWFpbkdyb3VwLCBmb3IgUmV2ZXJzZSBvbmx5LiAKCmBgYHtyIG5lY2sgYW5vdmEzLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gJ21hcmt1cCd9CiMgIyBuZWNrIEFOT1ZBIDMKIyBuZWNrX2FvdjMgPC0gYW92KG5lY2sgfiBtYWluZ3JvdXAsIGRhdGEgPSBmaWx0ZXIoYW9pM19kYXRhLCBkaXJlY3Rpb24gPT0gInJldmVyc2VkIikpCiMgc3VtbWFyeShuZWNrX2FvdjMpCiMgIyBuZWNrX2xzZDMgPC0gTFNELnRlc3QobmVja19hb3YzLCAibWFpbmdyb3VwIiwgZ3JvdXAgPSBGQUxTRSkKIyAjIG5lY2tfbHNkMyRjb21wYXJpc29uCmV6QU5PVkEoCiAgZGF0YSA9IGZpbHRlcihhb2kzX2RhdGEsIGRpcmVjdGlvbiA9PSAicmV2ZXJzZWQiKSwKICBkdiA9IG5lY2ssCiAgd2lkID0gaWQsCiAgYmV0d2VlbiA9IG1haW5ncm91cCwKICB0eXBlID0gMwopWyJBTk9WQSJdCmBgYAoKIyMgRmFjZUNoZXN0CgpXZSBvcmlnaW5hbGx5IGRlZmluZWQgRmFjZUNoZXN0IHN1Y2ggdGhhdAoKMS4gRmFjZSA9IGV5ZXMgKyBtb3V0aCArIGNoaW4KMS4gQ2hlc3QgPSB1cHBlcmNoZXN0ICsgbWlkY2hlc3QgKyBsb3dlcmNoZXN0CgpCVVQuIENoaW4gaXMgYWN0dWFsbHkgbmVjay4gSXQncyBub3QgZXZlbiBwYXJ0IG9mIHRoZSBmYWNlIGlmIHlvdSB0aGluayBhYm91dCBpdC4gU28gSSdtIHJlZGVmaW5pbmcgRmFjZUNoZXN0IGFzOgoKMS4gRmFjZSA9IGZvcmVoZWFkICsgZXllcyArIG1vdXRoCjEuIENoZXN0ID0gbmVjayArIHVwcGVyY2hlc3QgKyBtaWRjaGVzdCArIGxvd2VyY2hlc3QKClNvIGxldCdzIGRvIHRoaXMuIFRoZW4gc2VlIHdoYXQncyBoYXBwZW5pbmcgYWNyb3NzIGdyb3VwcyBmb3IgRmFjZUNoZXN0LgoKYGBge3IgY2FsY3VsYXRlIGZhY2VjaGVzdCwgZWNobz1GQUxTRSwgcmVzdWx0cyA9ICdtYXJrdXAnfQojIENhbGN1bGF0ZSBmYWNlLCBjaGVzdCwgYW5kIGZhY2VjaGVzdCAtIGFuZCBtb3V0aGV5ZSB0b28KZnVsbGRhdGEgPC0gZnVsbGRhdGEgJT4lCiAgcm93d2lzZSgpICU+JQogIG11dGF0ZShmYWNlID0gc3VtKGZvcmVoZWFkLCBleWVzLCBtb3V0aCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgY2hlc3QgPSBzdW0obmVjaywgdXBwZXJjaGVzdCwgbWlkY2hlc3QsIGxvd2VyY2hlc3QsIG5hLnJtID0gVFJVRSksCiAgICAgICAgIGZhY2VjaGVzdCA9IChmYWNlIC0gY2hlc3QpLyhmYWNlICsgY2hlc3QpLAogICAgICAgICBtb3V0aGV5ZSA9IChtb3V0aCAtIGV5ZXMpLyhtb3V0aCArIGV5ZXMpKQoKIyBmdWxsZGF0YSAlPiUgCiMgICBnYXRoZXIobWV0cmljLCB2YWx1ZSwgYyhmYWNlY2hlc3Rfb2xkLCBmYWNlY2hlc3QpKSAlPiUKIyAgIGdncGxvdChhZXMoeCA9IG1haW5ncm91cCwgeSA9IHZhbHVlLCBmaWxsID0gZGlyZWN0aW9uKSkgKyBnZW9tX2JveHBsb3QoKSArIGZhY2V0X3dyYXAoIm1ldHJpYyIpCmBgYAoKQ29vbC4gTmV4dCB3ZSdsbCBkbyBlcnJvciBiYXIgY2hhcnRzIHVzaW5nIHRoZSBuZXcgRmFjZUNoZXN0IGFjcm9zcyBncm91cHMuIAoKYGBge3IgZmFjZWNoZXN0IGJhcnMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZhY2VjaGVzdF9pbmZvIDwtIGZ1bGxkYXRhICU+JQogIGZpbHRlcihleWVfZXhjbHVkZSA9PSBGQUxTRSkgJT4lCiAgZ3JvdXBfYnkobWFpbmdyb3VwLCBkaXJlY3Rpb24sIHBhcnRpY2lwYW50KSAlPiUKICBzdW1tYXJpc2UoZmFjZWNoZXN0ID0gbWVhbihmYWNlY2hlc3QsIG5hLnJtID0gVFJVRSkpICU+JQogIGdyb3VwX2J5KG1haW5ncm91cCwgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oZmFjZWNoZXN0KSwKICAgICAgICAgICAgc2QgPSBzZChmYWNlY2hlc3QpLAogICAgICAgICAgICBuID0gbigpLAogICAgICAgICAgICBzZSA9IHNkL3NxcnQobikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUobWFpbmdyb3VwID0gY2FzZV93aGVuKAogICAgbWFpbmdyb3VwID09ICJEZWFmRWFybHkiIH4gIkRlYWYgRWFybHkiLAogICAgbWFpbmdyb3VwID09ICJEZWFmTGF0ZSIgfiAiRGVhZiBMYXRlIiwKICAgIG1haW5ncm91cCA9PSAiSGVhcmluZ0xhdGUiIH4gIkhlYXJpbmcgTGF0ZSIsCiAgICBtYWluZ3JvdXAgPT0gIkhlYXJpbmdOb3ZpY2UiIH4gIkhlYXJpbmcgTm92aWNlIgogICAgKSkKCmdncGxvdChmYWNlY2hlc3RfaW5mbywgYWVzKHggPSBtYWluZ3JvdXAsIHkgPSBtZWFuLCBmaWxsID0gZGlyZWN0aW9uLCBjb2xvciA9IGRpcmVjdGlvbikpICsKICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuNSksIHNpemUgPSAyKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuLXNlLCB5bWF4ID0gbWVhbitzZSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC41KSwgd2lkdGggPSAwLjMsIHNpemUgPSAxKSArCiAgbGFicyh0aXRsZSA9ICJGYWNlLUNoZXN0IFJhdGlvIiwgeCA9ICIiLCB5ID0gImZhY2UtY2hlc3QgcmF0aW8iKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEsMSkpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIHRoZW1lX2J3KCkKYGBgCgpOb3cgbGV0J3MgZG8gdGhlIEFOT1ZBcy4gQWxzbyBza2lwcGluZyBMU0RzIGhlcmUuIAoKMS4gQU5PVkEgd2l0aCBmYWN0b3JzIE1haW5Hcm91cCAmIERpcmVjdGlvbi4KCmBgYHtyIGZhY2VjaGVzdCBhbm92YSAxLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gJ21hcmt1cCcsIG1lc3NhZ2U9RkFMU0V9CiMgQ3JlYXRlIHRoZSBwYXJ0aWNpcGFudC1sZXZlbCBkYiAobGV0J3MgYWxzbyBwb3AgbW91dGhleWUgaW4gdGhpcyB0b28pCmZjX2RhdGEgPC0gZnVsbGRhdGEgJT4lCiAgZmlsdGVyKGV5ZV9leGNsdWRlID09IEZBTFNFKSAlPiUKICBzZWxlY3QoaWQsIG1haW5ncm91cCwgaGVhcmluZywgYW9hc2wsIGFnZSwgZGlyZWN0aW9uLCBmYWNlY2hlc3QsIG1vdXRoZXllKSAlPiUKICBncm91cF9ieShpZCwgZGlyZWN0aW9uKSAlPiUKICBtdXRhdGUoZmFjZWNoZXN0ID0gbWVhbihmYWNlY2hlc3QsIG5hLnJtID0gVFJVRSksCiAgICAgICAgIG1vdXRoZXllID0gbWVhbihtb3V0aGV5ZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZmlsdGVyKGlkICE9ICI2IikKCiMgIyBmYWNlY2hlc3QgQU5DT1ZBIDEKIyBmYWNlY2hlc3RfYW92MSA8LSBhb3YoZmFjZWNoZXN0IH4gbWFpbmdyb3VwICogZGlyZWN0aW9uLCBkYXRhID0gZmNfZGF0YSkKIyBzdW1tYXJ5KGZhY2VjaGVzdF9hb3YxKQojICMgZmFjZWNoZXN0X2xzZDEgPC0gTFNELnRlc3QoZmFjZWNoZXN0X2FvdjEsICJtYWluZ3JvdXAiLCBncm91cCA9IEZBTFNFKQojICMgZmFjZWNoZXN0X2xzZDEkY29tcGFyaXNvbgoKZXpBTk9WQSgKICBkYXRhID0gZmNfZGF0YSwKICBkdiA9IGZhY2VjaGVzdCwKICB3aWQgPSBpZCwKICB3aXRoaW4gPSBkaXJlY3Rpb24sCiAgYmV0d2VlbiA9IG1haW5ncm91cCwKICB0eXBlID0gMwopWyJBTk9WQSJdCmBgYAoKMi4gQU5PVkEgd2l0aCBmYWN0b3IgTWFpbkdyb3VwLCBmb3IgRm9yd2FyZCBvbmx5LgoKYGBge3IgZmFjZWNoZXN0IGFub3ZhMiwgZWNobz1GQUxTRSwgcmVzdWx0cyA9ICdtYXJrdXAnfQojICMgZmFjZWNoZXN0IEFOT1ZBIDIKIyBmYWNlY2hlc3RfYW92MiA8LSBhb3YoZmFjZWNoZXN0IH4gbWFpbmdyb3VwLCBkYXRhID0gZmlsdGVyKGZjX2RhdGEsIGRpcmVjdGlvbiA9PSAiZm9yd2FyZCIpKQojIHN1bW1hcnkoZmFjZWNoZXN0X2FvdjIpCiMgIyBmYWNlY2hlc3RfbHNkMiA8LSBMU0QudGVzdChmYWNlY2hlc3RfYW92MiwgIm1haW5ncm91cCIsIGdyb3VwID0gRkFMU0UpCiMgIyBmYWNlY2hlc3RfbHNkMiRjb21wYXJpc29uCgplekFOT1ZBKAogIGRhdGEgPSBmaWx0ZXIoZmNfZGF0YSwgZGlyZWN0aW9uID09ICJmb3J3YXJkIiksCiAgZHYgPSBmYWNlY2hlc3QsCiAgd2lkID0gaWQsCiAgYmV0d2VlbiA9IG1haW5ncm91cCwKICB0eXBlID0gMwopWyJBTk9WQSJdCmBgYAoKMy4gQU5PVkEgd2l0aCBmYWN0b3IgTWFpbkdyb3VwLCBmb3IgUmV2ZXJzZSBvbmx5LiAKCmBgYHtyIGZhY2VjaGVzdCBhbm92YTMsIGVjaG89RkFMU0UsIHJlc3VsdHMgPSAnbWFya3VwJ30KIyAjIGZhY2VjaGVzdCBBTk9WQSAzCiMgZmFjZWNoZXN0X2FvdjMgPC0gYW92KGZhY2VjaGVzdCB+IG1haW5ncm91cCwgZGF0YSA9IGZpbHRlcihmY19kYXRhLCBkaXJlY3Rpb24gPT0gInJldmVyc2VkIikpCiMgc3VtbWFyeShmYWNlY2hlc3RfYW92MykKIyAjIGZhY2VjaGVzdF9sc2QzIDwtIExTRC50ZXN0KGZhY2VjaGVzdF9hb3YzLCAibWFpbmdyb3VwIiwgZ3JvdXAgPSBGQUxTRSkKIyAjIGZhY2VjaGVzdF9sc2QzJGNvbXBhcmlzb24KZXpBTk9WQSgKICBkYXRhID0gZmlsdGVyKGZjX2RhdGEsIGRpcmVjdGlvbiA9PSAicmV2ZXJzZWQiKSwKICBkdiA9IGZhY2VjaGVzdCwKICB3aWQgPSBpZCwKICBiZXR3ZWVuID0gbWFpbmdyb3VwLAogIHR5cGUgPSAzCilbIkFOT1ZBIl0KYGBgCgojIEV5ZSBHYXplICYgUGVyZm9ybWFuY2UgQ29ycmVsYXRpb25zCgpOZXh0IHdlJ3JlIGdvaW5nIHRvIGNvcnJlbGF0ZSBvdXIgZXllIGdhemUgbWV0cmljcyAoRXllLCBNb3V0aCwgTmVjaywgYW5kIEZhY2VDaGVzdCkgd2l0aCBsZXhpY2FsIHJlY2FsbCBhbmQgZ2lzdC4gT2theSEgQnV0IHJlbWVtYmVyIHdlIGhhdmUgYSBzbGlnaHRseSBzbWFsbGVyIGRhdGFzZXQgaGVyZSBiZWNhdXNlIHdlJ3ZlIGV4Y2x1ZGVkIHNvbWUgcGFydGljaXBhbnRzIGZvciBoYXZpbmcgYmFkIGV5ZSBkYXRhIChidXQgdGhleSBoYWQgdmFsaWQgYmVoYXZpb3JhbCBkYXRhIHNvIHdlIGtlcHQgdGhlbSBpbiB0aGUgQW9BLVBlcmZvcm1hbmNlIGNvcnJlbGF0aW9ucyBhYm92ZSkuIAoKKipJTVBPUlRBTlQ6IFdlIGFsc28gcmVtb3ZlZCBnaXN0X2ZvcndhcmQgY29sdW1uLioqCgpgYGB7ciByZXBhY2thZ2UgZGF0YSBmb3IgY29ycmVsYXRpb25zIGFnYWlufQpleWVwZXJmIDwtIGZ1bGxkYXRhICU+JQogIGZpbHRlcihleWVfZXhjbHVkZSA9PSBGQUxTRSkgJT4lCiAgc2VsZWN0KHBhcnRpY2lwYW50LCBtYWluZ3JvdXAsIGhlYXJpbmcsIGRpcmVjdGlvbiwgYW9hc2wsIHNpZ255cnMsIHNlbGZyYXRlLCBhY2MsIGdpc3QsIGV5ZXMsIG1vdXRoLCBuZWNrLCBmYWNlY2hlc3QpICU+JQogIGdyb3VwX2J5KG1haW5ncm91cCwgcGFydGljaXBhbnQsIGRpcmVjdGlvbikgJT4lCiAgbXV0YXRlKGdpc3QgPSBtZWFuKGdpc3QsIG5hLnJtID0gVFJVRSksCiAgICAgICAgIGxleCA9IG1lYW4oYWNjLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBleWVzID0gbWVhbihleWVzLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBtb3V0aCA9IG1lYW4obW91dGgsIG5hLnJtID0gVFJVRSksCiAgICAgICAgIG5lY2sgPSBtZWFuKG5lY2ssIG5hLnJtID0gVFJVRSksCiAgICAgICAgIGZhY2VjaGVzdCA9IG1lYW4oZmFjZWNoZXN0LCBuYS5ybSA9IFRSVUUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KG1haW5ncm91cCwgcGFydGljaXBhbnQsIGhlYXJpbmcsIGRpcmVjdGlvbiwgYW9hc2wsIHNpZ255cnMsIHNlbGZyYXRlLCBnaXN0LCBsZXgsIGV5ZXMsIG1vdXRoLCBuZWNrLCBmYWNlY2hlc3QpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZ2F0aGVyKG1ldHJpYywgdmFsdWUsIGdpc3Q6ZmFjZWNoZXN0KSAlPiUKICB1bml0ZShtZXRyaWN2YWx1ZSwgYyhtZXRyaWMsIGRpcmVjdGlvbiksIHNlcCA9ICJfIikgJT4lCiAgc3ByZWFkKG1ldHJpY3ZhbHVlLCB2YWx1ZSkgJT4lCiAgc2VsZWN0KC1wYXJ0aWNpcGFudCwgLW1haW5ncm91cCkgJT4lCiAgc2VsZWN0KGhlYXJpbmcsIGFvYXNsLCBzaWdueXJzLCBzZWxmcmF0ZSwgZ2lzdF9yZXZlcnNlZCwgbGV4X2ZvcndhcmQsIGxleF9yZXZlcnNlZCwgZXllc19mb3J3YXJkLAogICAgICAgICBleWVzX3JldmVyc2VkLCBtb3V0aF9mb3J3YXJkLCBtb3V0aF9yZXZlcnNlZCwgbmVja19mb3J3YXJkLCBuZWNrX3JldmVyc2VkLCAKICAgICAgICAgZmFjZWNoZXN0X2ZvcndhcmQsIGZhY2VjaGVzdF9yZXZlcnNlZCkKCmV5ZXBlcmZfZGVhZiA8LSBleWVwZXJmICU+JSBmaWx0ZXIoaGVhcmluZyA9PSAiRGVhZiIpICU+JSBzZWxlY3QoLWhlYXJpbmcpCmV5ZXBlcmZfZGVhZl9mdyA8LSBleWVwZXJmX2RlYWYgJT4lIHNlbGVjdChhb2FzbCwgc2lnbnlycywgc2VsZnJhdGUsIGxleF9mb3J3YXJkLCBleWVzX2ZvcndhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3V0aF9mb3J3YXJkLCBuZWNrX2ZvcndhcmQsIGZhY2VjaGVzdF9mb3J3YXJkKQpleWVwZXJmX2RlYWZfcnYgPC0gZXllcGVyZl9kZWFmICU+JSBzZWxlY3QoYW9hc2wsIHNpZ255cnMsIHNlbGZyYXRlLCBnaXN0X3JldmVyc2VkLCBsZXhfcmV2ZXJzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleWVzX3JldmVyc2VkLCBtb3V0aF9yZXZlcnNlZCwgbmVja19yZXZlcnNlZCwgZmFjZWNoZXN0X3JldmVyc2VkKQpleWVwZXJmX2hlYXJpbmcgPC0gZXllcGVyZiAlPiUgZmlsdGVyKGhlYXJpbmcgPT0gIkhlYXJpbmciKSAlPiUgc2VsZWN0KC1oZWFyaW5nKQpleWVwZXJmX2hlYXJpbmdfZncgPC0gZXllcGVyZl9oZWFyaW5nICU+JSBzZWxlY3QoYW9hc2wsIHNpZ255cnMsIHNlbGZyYXRlLCBsZXhfZm9yd2FyZCwgZXllc19mb3J3YXJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91dGhfZm9yd2FyZCwgbmVja19mb3J3YXJkLCBmYWNlY2hlc3RfZm9yd2FyZCkKZXllcGVyZl9oZWFyaW5nX3J2IDwtIGV5ZXBlcmZfaGVhcmluZyAlPiUgc2VsZWN0KGFvYXNsLCBzaWdueXJzLCBzZWxmcmF0ZSwgZ2lzdF9yZXZlcnNlZCwgbGV4X3JldmVyc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXllc19yZXZlcnNlZCwgbW91dGhfcmV2ZXJzZWQsIG5lY2tfcmV2ZXJzZWQsIGZhY2VjaGVzdF9yZXZlcnNlZCkKZXllcGVyZl9hbGwgPC0gZXllcGVyZiAlPiUgc2VsZWN0KC1oZWFyaW5nKQpleWVwZXJmX2FsbF9mdyA8LSBleWVwZXJmX2FsbCAlPiUgc2VsZWN0KGFvYXNsLCBzaWdueXJzLCBzZWxmcmF0ZSwgbGV4X2ZvcndhcmQsIGV5ZXNfZm9yd2FyZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXRoX2ZvcndhcmQsIG5lY2tfZm9yd2FyZCwgZmFjZWNoZXN0X2ZvcndhcmQpCmV5ZXBlcmZfYWxsX3J2IDwtIGV5ZXBlcmZfYWxsICU+JSBzZWxlY3QoYW9hc2wsIHNpZ255cnMsIHNlbGZyYXRlLCBnaXN0X3JldmVyc2VkLCBsZXhfcmV2ZXJzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleWVzX3JldmVyc2VkLCBtb3V0aF9yZXZlcnNlZCwgbmVja19yZXZlcnNlZCwgZmFjZWNoZXN0X3JldmVyc2VkKQoKYGBgCiMjIERlYWYgQ29ycmVsYXRpb25zLCBGb3J3YXJkCmBgYHtyIHJvd3MucHJpbnQgPSAxNX0KIyBDb3JyZWxhdGlvbnMgZm9yIERlYWYKcHJpbnQoIkRFQUYgQ29ycmVsYXRpb25zIC0gUGVhcnNvbidzIHIiKQojY29yc3RhcnNsKGxleGdpc3RfZGVhZikKSG1pc2M6OnJjb3JyKGFzLm1hdHJpeChleWVwZXJmX2RlYWZfZncpKSRyCnByaW50KCJERUFGIENvcnJlbGF0aW9ucyAtIFAtdmFsdWVzIikKSG1pc2M6OnJjb3JyKGFzLm1hdHJpeChleWVwZXJmX2RlYWZfZncpKSRQCmNhdChwYXN0ZSgiIiwiXG4iLCIiKSkKY29yc3RhcnNsKGV5ZXBlcmZfZGVhZl9mdykKYGBgCiMjIERlYWYgQ29ycmVsYXRpb25zLCBSZXZlcnNlZApgYGB7ciByb3dzLnByaW50ID0gMTV9CiMgQ29ycmVsYXRpb25zIGZvciBEZWFmCnByaW50KCJERUFGIENvcnJlbGF0aW9ucyAtIFBlYXJzb24ncyByIikKI2NvcnN0YXJzbChsZXhnaXN0X2RlYWYpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgoZXllcGVyZl9kZWFmX3J2KSkkcgpwcmludCgiREVBRiBDb3JyZWxhdGlvbnMgLSBQLXZhbHVlcyIpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgoZXllcGVyZl9kZWFmX3J2KSkkUApjYXQocGFzdGUoIiIsIlxuIiwiIikpCmNvcnN0YXJzbChleWVwZXJmX2RlYWZfcnYpCmBgYApgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIyBEZWFmIENvcnJlbGF0aW9ucywgQm90aCBEaXJlY3Rpb25zCiMgQ29ycmVsYXRpb25zIGZvciBEZWFmCnByaW50KCJERUFGIENvcnJlbGF0aW9ucyAtIFBlYXJzb24ncyByIikKI2NvcnN0YXJzbChsZXhnaXN0X2RlYWYpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgoZXllcGVyZl9kZWFmKSkkcgpwcmludCgiREVBRiBDb3JyZWxhdGlvbnMgLSBQLXZhbHVlcyIpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgoZXllcGVyZl9kZWFmKSkkUApjYXQocGFzdGUoIiIsIlxuIiwiIikpCmNvcnN0YXJzbChleWVwZXJmX2RlYWYpCmBgYAoKIyMgSGVhcmluZyBDb3JyZWxhdGlvbnMsIEZvcndhcmQKYGBge3Igcm93cy5wcmludCA9IDE1fQojIENvcnJlbGF0aW9ucyBmb3IgSGVhcmluZwpwcmludCgiSEVBUklORyBDb3JyZWxhdGlvbnMgLSBQZWFyc29uJ3MgciIpCiNjb3JzdGFyc2wobGV4Z2lzdF9oZWFyaW5nKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KGV5ZXBlcmZfaGVhcmluZ19mdykpJHIKcHJpbnQoIkhFQVJJTkcgQ29ycmVsYXRpb25zIC0gUC12YWx1ZXMiKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KGV5ZXBlcmZfaGVhcmluZ19mdykpJFAKY2F0KHBhc3RlKCIiLCJcbiIsIiIpKQpjb3JzdGFyc2woZXllcGVyZl9oZWFyaW5nX2Z3KQpgYGAKCiMjIEhlYXJpbmcgQ29ycmVsYXRpb25zLCBSZXZlcnNlZApgYGB7ciByb3dzLnByaW50ID0gMTV9CiMgQ29ycmVsYXRpb25zIGZvciBIZWFyaW5nCnByaW50KCJIRUFSSU5HIENvcnJlbGF0aW9ucyAtIFBlYXJzb24ncyByIikKI2NvcnN0YXJzbChsZXhnaXN0X2hlYXJpbmcpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgoZXllcGVyZl9oZWFyaW5nX3J2KSkkcgpwcmludCgiSEVBUklORyBDb3JyZWxhdGlvbnMgLSBQLXZhbHVlcyIpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgoZXllcGVyZl9oZWFyaW5nX3J2KSkkUApjYXQocGFzdGUoIiIsIlxuIiwiIikpCmNvcnN0YXJzbChleWVwZXJmX2hlYXJpbmdfcnYpCmBgYAoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyMgSGVhcmluZyBDb3JyZWxhdGlvbnMsIEJvdGggRGlyZWN0aW9ucwojIENvcnJlbGF0aW9ucyBmb3IgSGVhcmluZwpwcmludCgiSEVBUklORyBDb3JyZWxhdGlvbnMgLSBQZWFyc29uJ3MgciIpCiNjb3JzdGFyc2wobGV4Z2lzdF9oZWFyaW5nKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KGV5ZXBlcmZfaGVhcmluZykpJHIKcHJpbnQoIkhFQVJJTkcgQ29ycmVsYXRpb25zIC0gUC12YWx1ZXMiKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KGV5ZXBlcmZfaGVhcmluZykpJFAKY2F0KHBhc3RlKCIiLCJcbiIsIiIpKQpjb3JzdGFyc2woZXllcGVyZl9oZWFyaW5nKQpgYGAKCiMjIEFsbCBQZW9wbGUgQ29ycmVsYXRpb25zLCBGb3J3YXJkCmBgYHtyIGNvcnJlbGF0aW9ucyBmb3IgZXllcGVyZmZ3cnYsIHJvd3MucHJpbnQ9MTV9CgpleWVwZXJmX2Z3cnYgPC0gZnVsbGRhdGEgJT4lCiAgZmlsdGVyKGV5ZV9leGNsdWRlID09IEZBTFNFKSAlPiUKICBzZWxlY3QocGFydGljaXBhbnQsIG1haW5ncm91cCwgaGVhcmluZywgZGlyZWN0aW9uLCBhb2FzbCwgc2lnbnlycywgc2VsZnJhdGUsIGFjYywgZ2lzdCwgZXllcywgbW91dGgsIG5lY2ssIGZhY2VjaGVzdCkgJT4lCiAgZ3JvdXBfYnkobWFpbmdyb3VwLCBwYXJ0aWNpcGFudCwgZGlyZWN0aW9uKSAlPiUKICBtdXRhdGUoZ2lzdCA9IG1lYW4oZ2lzdCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgbGV4ID0gbWVhbihhY2MsIG5hLnJtID0gVFJVRSksCiAgICAgICAgIGV5ZXMgPSBtZWFuKGV5ZXMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgIG1vdXRoID0gbWVhbihtb3V0aCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgbmVjayA9IG1lYW4obmVjaywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgZmFjZWNoZXN0ID0gbWVhbihmYWNlY2hlc3QsIG5hLnJtID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QobWFpbmdyb3VwLCBwYXJ0aWNpcGFudCwgaGVhcmluZywgZGlyZWN0aW9uLCBhb2FzbCwgc2lnbnlycywgc2VsZnJhdGUsIGdpc3QsIGxleCwgZXllcywgbW91dGgsIG5lY2ssIGZhY2VjaGVzdCkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBnYXRoZXIobWV0cmljLCB2YWx1ZSwgZ2lzdDpmYWNlY2hlc3QpICU+JQogIHVuaXRlKG1ldHJpY3ZhbHVlLCBjKG1ldHJpYywgZGlyZWN0aW9uKSwgc2VwID0gIl8iLCByZW1vdmUgPSBGQUxTRSkgJT4lCiAgc2VsZWN0KC1tZXRyaWMpICU+JQogIHNwcmVhZChtZXRyaWN2YWx1ZSwgdmFsdWUpICU+JQogIHNlbGVjdCgtcGFydGljaXBhbnQsIC1tYWluZ3JvdXAsIC1oZWFyaW5nKSAlPiUKICBzZWxlY3QoZGlyZWN0aW9uLCBhb2FzbCwgc2lnbnlycywgc2VsZnJhdGUsIGdpc3RfcmV2ZXJzZWQsIGxleF9mb3J3YXJkLCBsZXhfcmV2ZXJzZWQsIGV5ZXNfZm9yd2FyZCwgZXllc19yZXZlcnNlZCwKICAgICAgICAgbW91dGhfZm9yd2FyZCwgbW91dGhfcmV2ZXJzZWQsIG5lY2tfZm9yd2FyZCwgbmVja19yZXZlcnNlZCwgZmFjZWNoZXN0X2ZvcndhcmQsIGZhY2VjaGVzdF9yZXZlcnNlZCkKCmV5ZXBlcmZfZncgPC0gZXllcGVyZl9md3J2ICU+JSBmaWx0ZXIoZGlyZWN0aW9uID09ICJmb3J3YXJkIikgJT4lIAogIHNlbGVjdCgtZGlyZWN0aW9uLCAtZ2lzdF9yZXZlcnNlZCwgLWxleF9yZXZlcnNlZCwgLWV5ZXNfcmV2ZXJzZWQsIC1tb3V0aF9yZXZlcnNlZCwgLW5lY2tfcmV2ZXJzZWQsIC1mYWNlY2hlc3RfcmV2ZXJzZWQpCmV5ZXBlcmZfcnYgPC0gZXllcGVyZl9md3J2ICU+JSBmaWx0ZXIoZGlyZWN0aW9uID09ICJyZXZlcnNlZCIpICU+JSBzZWxlY3QoLWRpcmVjdGlvbiwgLWxleF9mb3J3YXJkLCAtZXllc19mb3J3YXJkLCAtbW91dGhfZm9yd2FyZCwgLW5lY2tfZm9yd2FyZCwgLWZhY2VjaGVzdF9mb3J3YXJkKQoKIyBDb3JyZWxhdGlvbnMgZm9yIEZXCnByaW50KCJGVyBDb3JyZWxhdGlvbnMgLSBQZWFyc29uJ3MgciIpCiNjb3JzdGFyc2wobGV4Z2lzdF9kZWFmKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KGV5ZXBlcmZfZncpKSRyCnByaW50KCJGVyBDb3JyZWxhdGlvbnMgLSBQLXZhbHVlcyIpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgoZXllcGVyZl9mdykpJFAKY2F0KHBhc3RlKCIiLCJcbiIsIiIpKQpjb3JzdGFyc2woZXllcGVyZl9mdykKYGBgCgojIyBBbGwgUGVvcGxlIENvcnJlbGF0aW9ucywgUmV2ZXJzZWQKYGBge3IgY29ycmVsYXRpb25zIGZvciBleWVwZXJmcnYsIHJvd3MucHJpbnQ9MTV9CiMgQ29ycmVsYXRpb25zIGZvciBSVgpwcmludCgiUlYgQ29ycmVsYXRpb25zIC0gUGVhcnNvbidzIHIiKQojY29yc3RhcnNsKGxleGdpc3RfaGVhcmluZykKSG1pc2M6OnJjb3JyKGFzLm1hdHJpeChleWVwZXJmX3J2KSkkcgpwcmludCgiUlYgQ29ycmVsYXRpb25zIC0gUC12YWx1ZXMiKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KGV5ZXBlcmZfcnYpKSRQCmNhdChwYXN0ZSgiIiwiXG4iLCIiKSkKY29yc3RhcnNsKGV5ZXBlcmZfcnYpCmBgYAoKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMjIEFsbCBQZW9wbGUgQ29ycmVsYXRpb25zLCBCb3RoIERpcmVjdGlvbnMKIyBDb3JyZWxhdGlvbnMgZm9yIEFsbApwcmludCgiQUxMIENvcnJlbGF0aW9ucyAtIFBlYXJzb24ncyByIikKI2NvcnN0YXJzbChsZXhnaXN0X2FsbCkKSG1pc2M6OnJjb3JyKGFzLm1hdHJpeChleWVwZXJmX2FsbCkpJHIKcHJpbnQoIkFMTCBDb3JyZWxhdGlvbnMgLSBQLXZhbHVlcyIpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgoZXllcGVyZl9hbGwpKSRQCmNvcnN0YXJzbChleWVwZXJmX2FsbCkKYGBgCgojIyBDb3JyZWxhdGlvbiBUYWJsZQpBbmQgdGhlIGNvcnJlbGF0aW9uIHRhYmxlLgoKYGBge3IgZXllcGVyZiBjb3JyZWxhdGlvbiBjaGFydHMsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2dwYWlycyhleWVwZXJmLCBjb2x1bW5zID0gYygyOjEzKSwgYWVzKGNvbG9yID0gaGVhcmluZykpCmBgYAoKIyBIZWF0IE1hcHMKQW5kIGZpbmFsbHksIHdlJ3JlIGdvaW5nIHRvIGRvIGhlYXQgbWFwcy4gCmBgYHtyIGhlYXQgbWFwfQpleWVnYXplX2hlYXQgPC0gZnVsbGRhdGEgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcihleWVfZXhjbHVkZSA9PSBGQUxTRSkgJT4lCiAgc2VsZWN0KGlkOmRpcmVjdGlvbiwgYmVsbHksIGxvd2VyY2hlc3QsIG1pZGNoZXN0LCB1cHBlcmNoZXN0LCBuZWNrLCBtb3V0aCwgZXllcywgZm9yZWhlYWQpICU+JQogIGdhdGhlcihhb2ksIHBlcmNlbnQsIGJlbGx5OmZvcmVoZWFkKSAlPiUKICBncm91cF9ieShtYWluZ3JvdXAsIHBhcnRpY2lwYW50LCBkaXJlY3Rpb24sIGFvaSkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtPVRSVUUpKSAlPiUKICBncm91cF9ieShtYWluZ3JvdXAsZGlyZWN0aW9uLGFvaSkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtPVRSVUUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKCFpcy5uYShhb2kpKSAlPiUKICBtdXRhdGUoYW9pID0gZmFjdG9yKGFvaSxsZXZlbHM9YygiYmVsbHkiLCJsb3dlcmNoZXN0IiwibWlkY2hlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cHBlcmNoZXN0IiwibmVjayIsIm1vdXRoIiwiZXllcyIsImZvcmVoZWFkIikpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKG1haW5ncm91cCA9IGNhc2Vfd2hlbigKICAgIG1haW5ncm91cCA9PSAiRGVhZkVhcmx5IiB+ICJEZWFmIEVhcmx5IiwKICAgIG1haW5ncm91cCA9PSAiRGVhZkxhdGUiIH4gIkRlYWYgTGF0ZSIsCiAgICBtYWluZ3JvdXAgPT0gIkhlYXJpbmdMYXRlIiB+ICJIZWFyaW5nIExhdGUiLAogICAgbWFpbmdyb3VwID09ICJIZWFyaW5nTm92aWNlIiB+ICJIZWFyaW5nIE5vdmljZSIKICAgICkpCgpleWVnYXplX2hlYXRfYWxsIDwtIGZ1bGxkYXRhICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIoZXllX2V4Y2x1ZGUgPT0gRkFMU0UpICU+JQogIHNlbGVjdChpZDpkaXJlY3Rpb24sIGJlbGx5LCBsb3dlcmNoZXN0LCBtaWRjaGVzdCwgdXBwZXJjaGVzdCwgbmVjaywgbW91dGgsIGV5ZXMsIGZvcmVoZWFkKSAlPiUKICBnYXRoZXIoYW9pLCBwZXJjZW50LCBiZWxseTpmb3JlaGVhZCkgJT4lCiAgZ3JvdXBfYnkobWFpbmdyb3VwLHBhcnRpY2lwYW50LGRpcmVjdGlvbixhb2kpICU+JQogIGRwbHlyOjpzdW1tYXJpemUocGVyY2VudCA9IG1lYW4ocGVyY2VudCwgbmEucm09VFJVRSkpICU+JQogIGdyb3VwX2J5KG1haW5ncm91cCxkaXJlY3Rpb24sYW9pKSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtPVRSVUUpKSAlPiUKICBncm91cF9ieShtYWluZ3JvdXAsYW9pKSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKHBlcmNlbnQgPSBtZWFuKHBlcmNlbnQsIG5hLnJtPVRSVUUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKCFpcy5uYShhb2kpKSAlPiUKICBtdXRhdGUoYW9pID0gZmFjdG9yKGFvaSxsZXZlbHM9YygiYmVsbHkiLCJsb3dlcmNoZXN0IiwibWlkY2hlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cHBlcmNoZXN0IiwibmVjayIsIm1vdXRoIiwiZXllcyIsImZvcmVoZWFkIikpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKG1haW5ncm91cCA9IGNhc2Vfd2hlbigKICAgIG1haW5ncm91cCA9PSAiRGVhZkVhcmx5IiB+ICJEZWFmIEVhcmx5IiwKICAgIG1haW5ncm91cCA9PSAiRGVhZkxhdGUiIH4gIkRlYWYgTGF0ZSIsCiAgICBtYWluZ3JvdXAgPT0gIkhlYXJpbmdMYXRlIiB+ICJIZWFyaW5nIExhdGUiLAogICAgbWFpbmdyb3VwID09ICJIZWFyaW5nTm92aWNlIiB+ICJIZWFyaW5nIE5vdmljZSIKICAgICkpCgpnZ3Bsb3QoZXllZ2F6ZV9oZWF0LCBhZXMoeCA9IG1haW5ncm91cCwgeSA9IGFvaSkpICsKICBnZW9tX3RpbGUoYWVzKGZpbGw9cGVyY2VudCksY29sb3I9ImxpZ2h0Z3JheSIsbmEucm09VFJVRSkgKyAKICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInZpcmlkaXMiLCBkaXJlY3Rpb249LTEsIGxpbWl0cyA9IGMoMCwuNzEpLCBsYWJlbHMgPSBwZXJjZW50LCBuYW1lID0gImxvb2tpbmcgdGltZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MzAsaGp1c3Q9MSksCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgY29sb3IgPSAiYmxhY2siLCBmYWNlID0gIml0YWxpYyIpLCAKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJ3aGl0ZSIsIGZpbGwgPSAid2hpdGUiKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gIndoaXRlIikpICsKICBmYWNldF9ncmlkKC4gfiBkaXJlY3Rpb24pICsKICB5bGFiKCIiKSArIHhsYWIoIiIpICsgZ2d0aXRsZSgiRXllIEdhemUgSGVhdCBNYXAsIGJ5IERpcmVjdGlvbiIpICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQ9YygwLDApKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAsMCkpCgoKZ2dwbG90KGV5ZWdhemVfaGVhdF9hbGwsIGFlcyh4ID0gbWFpbmdyb3VwLCB5ID0gYW9pKSkgKwogIGdlb21fdGlsZShhZXMoZmlsbD1wZXJjZW50KSxjb2xvcj0ibGlnaHRncmF5IixuYS5ybT1UUlVFKSArIAogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAidmlyaWRpcyIsIGRpcmVjdGlvbj0tMSwgbGltaXRzID0gYygwLC43MSksIGxhYmVscyA9IHBlcmNlbnQsIG5hbWUgPSAibG9va2luZyB0aW1lIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0zMCxoanVzdD0xKSwgCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJ3aGl0ZSIpKSArCiAgeWxhYigiIikgKyB4bGFiKCIiKSArIGdndGl0bGUoIkV5ZSBHYXplIEhlYXQgTWFwIChEaXJlY3Rpb24gQ29sbGFwc2VkKSIpICsKICBzY2FsZV95X2Rpc2NyZXRlKGV4cGFuZD1jKDAsMCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwwKSkKCmBgYAoKIyBTdW1tYXJ5CgpCZWxvdyBhcmUgdGhlIHAtdmFsdWVzIGZyb20gdGhlIEFOT1ZBcyB3aXRoIDQgTWFpbkdyb3Vwcy4gSSBuZXZlciBpbmNsdWRlZCBBZ2UgYXMgYSBjb3ZhcmlhdGUgYmVjYXVzZSBpdCBuZXZlciBpbXByb3ZlZCB0aGUgbW9kZWwuIEkgaW5jbHVkZWQgYWxsIEFOT1ZBcyBmb3IgR2lzdCBhbmQgTGV4IFJlY2FsbCwgYW5kIEFOT1ZBcyBmb3IgYW55IGV5ZSBBT0kgb3IgcmF0aW8gd2FzIGluY2x1ZGVkIG9ubHkgaWYgZWl0aGVyIG1haW5ncm91cCBvciBkaXJlY3Rpb24gd2FzIHNpZ25pZmljYW50LiBEZWFmZWFybHktRGVhZmxhdGUgc2hvd3MgdGhlIExTRCBwLXZhbHVlIGZvciB0aGF0IGNvbXBhcmlzb24uCmBgYHtyIHJlc3VsdHMxLCByb3dzLnByaW50ID0gMjB9CnJlc3VsdHMxIDwtIHN0cnVjdHVyZShsaXN0KG1vZGVsID0gYygiZ2lzdC1tYWluZ3JvdXAtYm90aCIsICJnaXN0LW1haW5ncm91cC1mdyIsIAoiZ2lzdC1tYWluZ3JvdXAtcnYiLCAibGV4cmVjYWxsLW1haW5ncm91cC1ib3RoIiwgImxleHJlY2FsbC1tYWluZ3JvdXAtZnciLCAKImxleHJlY2FsbC1tYWluZ3JvdXAtcnYiLCAibW91dGgtbWFpbmdyb3VwLWJvdGgiLCAidXBwZXJjaGVzdC1tYWluZ3JvdXAtYm90aCIsIAoidXBwZXJjaGVzdC1tYWluZ3JvdXAtcnYiLCAiZmFjZWNoZXN0LW1haW5ncm91cC1ib3RoIiwgIm1vdXRoZXllLW1haW5ncm91cC1ib3RoIgopLCBtYWluZ3JvdXAgPSBjKDAsIDAsIDAuMDEsIDAsIDAuMDQsIDAuMDIsIDAuMDYsIDAsIDAuMDEsIDAuMSwgCjAuMDUpLCBkaXJlY3Rpb24gPSBjKDAsIE5BLCBOQSwgMCwgTkEsIE5BLCAwLjA2LCAwLjE2LCBOQSwgMC4wNywgCjAuNDgpLCBgZGVhZmVhcmx5LWRlYWZsYXRlYCA9IGMoMC4xLCAwLjY5LCAwLjAyLCAwLjExLCAwLjk1LCAKMC4wNiwgMC4zOCwgMC45NCwgMC41MiwgMC4wOCwgMC42OCkpLCAuTmFtZXMgPSBjKCJtb2RlbCIsICJtYWluZ3JvdXAiLCAKImRpcmVjdGlvbiIsICJkZWFmZWFybHktZGVhZmxhdGUiKSwgY2xhc3MgPSBjKCJ0YmxfZGYiLCAidGJsIiwgCiJkYXRhLmZyYW1lIiksIHJvdy5uYW1lcyA9IGMoTkEsIC0xMUwpKQoKcmVzdWx0czEKYGBgCgpBbmQgYmVsb3cgYXJlIHRoZSBwLXZhbHVlcyBmcm9tIHRoZSBBTkNPVkFzIHdpdGggSGVhcmluZyAmIEFvQVNMLiBJIGluY2x1ZGVkIGFsbCBBTkNPVkFzIGZvciBHaXN0IGFuZCBMZXggUmVjYWxsLCBhbmQgQU5DT1ZBcyBmb3IgYW55IGV5ZSBBT0kgb3IgcmF0aW8gd2FzIGluY2x1ZGVkIG9ubHkgaWYgYW55IG1haW4gZmFjdG9yIHdhcyBzaWduaWZpY2FudC4gTFNEIGNvbXBhcmlzb25zIGFyZSBub3QgbmVlZGVkIGJlY2F1c2UgdGhlcmUncyBvbmx5IDIgbGV2ZWxzIGluIGVhY2ggZ3JvdXAhCgpgYGB7ciByZXN1bHRzMiwgcm93cy5wcmludCA9IDI1fQpyZXN1bHRzMiA8LSBzdHJ1Y3R1cmUobGlzdChtb2RlbCA9IGMoImdpc3QtYm90aCIsICJnaXN0LWZ3IiwgImdpc3QtcnYiLCAibGV4LWJvdGgiLCAKImxleC1mdyIsICJsZXgtcnYiLCAiZm9yZWhlYWQtZnciLCAibW91dGgtYm90aCIsICJtb3V0aC1ydiIsIAoidXBwZXJjaGVzdC1ib3RoIiwgInVwcGVyY2hlc3QtcnYiLCAiZmFjZWNoZXN0LWJvdGgiLCAibW91dGhleWUtYm90aCIKKSwgaGVhcmluZyA9IGMoMCwgMC4wMCwgMC4wMSwgMC4wMSwgMC4yMiwgMC4wMywgMC4wNiwgMC4wMSwgCjAuMDQsIDAuMDEsIDAuMDEsIDAuMzUsIDAuMDcpLCBkaXJlY3Rpb24gPSBjKDAsIE5BLCBOQSwgMCwgTkEsIApOQSwgTkEsIDAuMDUsIE5BLCAwLjIxLCBOQSwgMC4wNSwgMC41MiksIGFvYXNsID0gYygwLjIyLCAwLjc3LCAKMC4xOSwgMC41NiwgMC41OCwgMC4yNSwgMC4wOCwgMC4wNiwgMC4xMiwgMC42OCwgMC45NSwgMC4xMiwgMC40NAopLCBhZ2UgPSBjKDAuMDgsIDAuMDEsIDAuODYsIDAuMDksIDAuMDIsIDAuNywgMC42OCwgMC4yOCwgMC41LCAKMC4wMiwgMC4wOCwgMC4wMCwgMC4yMSkpLCAuTmFtZXMgPSBjKCJtb2RlbCIsICJoZWFyaW5nIiwgImRpcmVjdGlvbiIsIAoiYW9hc2wiLCAiYWdlIiksIGNsYXNzID0gYygidGJsX2RmIiwgInRibCIsICJkYXRhLmZyYW1lIiksIHJvdy5uYW1lcyA9IGMoTkEsIAotMTNMKSkKcmVzdWx0czIKYGBgCgpGaW5hbGx5LCB0aGUgY29ycmVsYXRpb25zIGZvciBEZWFmIGFuZCBIZWFyaW5nIHNlcGFyYXRlbHkgYXJlIG5vdCBzaWduaWZpY2FudC4gQnV0IHRoZXJlIGFyZSBzaWduaWZpY2FudCBjb3JyZWxhdGlvbnMgYWNyb3NzIGFsbCBwYXJ0aWNpcGFudHMuIEkgd29ycnkgaXQgaXMgY2F1c2VkIGJ5IEhlYXJpbmdOb3ZpY2UsIHRob3VnaC4uLgoKYGBge3IgY29ycmVsYXRpb24gdGFibGV9CnJlc3VsdHMzIDwtIHRyaWJibGUoCiAgfiBtZXRyaWMsIH4gQW9BU0xjb3JyZWxhdGlvblJ2YWx1ZSwgfiBQdmFsdWUsCiAgImdpc3QtZnciLCAtMC4zMiwgMC4wMTksCiAgImdpc3QtcnYiLCAtMC4zOSwgMC4wMDQsCiAgImxleC1mdyIsIC0wLjA4LCAwLjU2NywKICAibGV4LXJ2IiwgLTAuMzQsIDAuMDE0CikKcmVzdWx0czMKYGBgCgojIFRlcm5hcnkgUGxvdHMKCkxldCdzIG1ha2UgdHJpYW5nbGUgcGxvdHMuICJXaGF0PyIgeW91IHNheS4gUmVhZCBvbi4gCgpgYGB7ciBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoZ2d0ZXJuKQpmdWxsZGF0YSAlPiUgCiAgZ2d0ZXJuKGFlcyh4ID0gZXllcywgeSA9IG1vdXRoLCB6ID0gbmVjaykpICsgZmFjZXRfZ3JpZChkaXJlY3Rpb24gfiBtYWluZ3JvdXApICsgc3RhdF9kZW5zaXR5X3Rlcm4oZ2VvbT0ncG9seWdvbicsIGFlcyhmaWxsPS4ubGV2ZWwuLiksIGJpbnM9NCkgKyBnZW9tX3BvaW50KGNvbG9yID0gIndoaXRlIiwgYWxwaGEgPSAwLjUpICsgdGhlbWVfYncoKQoKZnVsbGRhdGEgJT4lIAogIGdndGVybihhZXMoeCA9IGV5ZXMsIHkgPSBtb3V0aCwgeiA9IG5lY2spKSArIGZhY2V0X2dyaWQoZGlyZWN0aW9uIH4gbWFpbmdyb3VwKSArIGdlb21fY29uZmlkZW5jZV90ZXJuKGJyZWFrcyA9IGMoLjUpLCBjb2xvciA9ICJyZWQiKSArIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkKYGBgCgojIFJhaW4ncyBOb3RlcwpBYm91dCBBZHVsdHM6CgotSSB0aGluayBJIHdhbnQgdG8gd3JpdGUgaXQgdXAgYXMgYW4gQU5DT1ZBLCB3aXRoIGRpcmVjdGlvbiBpbmNsdWRlZC4gIEFuZCBMU0QgY29tcGFyaXNvbnMgaW5zdGVhZCBvZiBUdWtleS4gIChJIHdpbGwgZG8gbXkgb3duIGNvcnJlY3Rpb25zKQotWW91IG9mdGVuIGhhdmUgb25lIGxpbmVycyBzdW1tYXJpemluZyByZXN1bHRzLCBpbiBhbGwgdGFicywgdGhvc2UgYXJlIG5pY2UsIGtlZXAgdGhlbSBjb21pbmcuCi0oSWYgeW91IGhhdmUgcmVhc29ucyB0byBwcmVzZW50IGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIEFOQ09WQSwgcHV0IHRoYXQgaW4geW91ciByZXN1bHRzIHRhYikKIApJIHRoaW5rIGlmIHdlIGRvIGl0IHRoaXMgd2F5IHRoZW4gd2UgZ2V0IGEgcmVhbGx5IGltcG9ydGFudCBzdG9yeSB0byB0ZWxsOiAgVGhhdCB0aGUgKmNyaXRpY2FsKiBBb0EgY3V0b2ZmIGlzIGJlbG93IDQgdnMgYWJvdmUgNCB5ZWFycyBvZiBhZ2UgKHR3byBncm91cHMgMC00IHZzIDQtMTMpLiAgVGhpcyBzdWdnZXN0IGVhcmx5IEFTTCBpcyBpbXBvcnRhbnQuICAKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMgR2lzdCBhcyBiaW5vbWlhbCBsb2dpdC1saW5rIGZ1bmN0aW9uIG1vZGVsCmdpc3RfZ2xtbSA8LSBnbG1lcihnaXN0IH4gZGlyZWN0aW9uICogbWFpbmdyb3VwICsgKDF8aWQpICsgKDF8c3RvcnkpLCBkYXRhID0gZnVsbGRhdGEsIGZhbWlseT1iaW5vbWlhbCAobGluaz0ibG9naXQiKSkKc3VtbWFyeShnaXN0X2dsbW0pCmBgYAoKIyBWaWV3aW5nIFNwYWNlIENvcnJlbGF0aW9ucyAKCk9rYXkgbm93IGxldCdzIHdvcmsgd2l0aCB0aGUgcmF3IHZpZXdpbmcgc3BhY2UgdGhhdCB3ZSBjcmVhdGVkIGluIFswNXZpZXdpbmdzcGFjZV0oMDV2aWV3aW5nc3BhY2UubmIuaHRtbCkuIEZvciBlYWNoIHBhcnRpY2lwYW50IHRoZSBmaXJzdCAzMCBzYW1wbGVzIHdhcyByZW1vdmVkLiAKCisgYm94IHdpZHRoCisgdXBwZXIgbGltaXQKKyBsb3dlciBsaW1pdAorIGxlZnQgc2lkZQorIHJpZ2h0IHNpZGUKKyBoZWlnaHQKKyBib3ggY2VudGVyIHBvc2l0aW9uCisgYXJlYQoKY29ycmVsYXRlZCB3aXRoIAoKKyBnaXN0CisgbGV4aWNhbCByZWNhbGwKKyBzaWduIHllYXJzCisgYW9hc2wKCkhlcmUncyBzYW1wbGUgb2YgdGhlIHJhdyB2aWV3aW5nIGRhdGEgc3RydWN0dXJlLiBJJ20gYWxzbyBnb2luZyB0byBmaXggcGFydGljaXBhbnQgbmFtZXMgYmVjYXVzZSB0aGUgcmF3IHZpZXdpbmcgZGF0YSBoYXMgdGhlIG9sZCBwYXJ0aWNpcGFudCBuYW1lcy4gCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp2aWV3aW5nIDwtIHJlYWRfY3N2KCcuLi9BZHVsdCBEYXRhL3Jhd2RhdGEvYWR1bHR2aWV3aW5nc3BhY2VyYXcuY3N2JywgcHJvZ3Jlc3M9RkFMU0UpIAoKIyBGaXggcGFydGljaXBhbnQgbmFtZXMKcGFydG5hbWVzIDwtIHJlYWRfY3N2KCJwYXJ0bmFtZXMuY3N2IikgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZShwYXJ0aWNpcGFudCA9IGFzLmNoYXJhY3RlcihwYXJ0aWNpcGFudCksCiAgICAgICAgIG5ld19wYXJ0aWNpcGFudCA9IGFzLmNoYXJhY3RlcihuZXdfcGFydGljaXBhbnQpKQp2aWV3aW5nIDwtIGxlZnRfam9pbih2aWV3aW5nLCBwYXJ0bmFtZXMsIGJ5ID0gInBhcnRpY2lwYW50IikgJT4lCiAgc2VsZWN0KC1wYXJ0aWNpcGFudCkgJT4lCiAgcmVuYW1lKHBhcnRpY2lwYW50ID0gbmV3X3BhcnRpY2lwYW50KSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBhcnRpY2lwYW50KSkgJT4lCiAgc2VsZWN0KHBhcnRpY2lwYW50LCBncm91cDptYWluZ3JvdXApCgojIFNob3cgdGFibGUKaGVhZCh2aWV3aW5nLCAxMCkKYGBgCgpOb3cgSSdtIGdvaW5nIHRvIGNvbXB1dGUgdGhlIGZvbGxvd2luZyBtZXRyaWNzIHdpdGggdGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyEKCisgKnVwcGVyKiAoNzV0aCBwZXJjZW50aWxlIG9uIHktYXhpcykKKyAqbG93ZXIqICgyNXRoIHBlcmNlbnRpbGUgb24geS1heGlzKQorICpsZWZ0KiAoMjV0aCBwZXJjZW50aWxlIG9uIHgtYXhpcykKKyAqcmlnaHQqICg3NXRoIHBlcmNlbnRpbGUgb24geC1heGlzKQorICp3aWR0aCogKHgtYXhpcyBJUVIpCisgKmhlaWdodCogKHktYXhpcyBJUVIpCisgKngtY2VudGVyKiAobWVkaWFuIHgtYXhpcykKKyAqeS1jZW50ZXIqIChtZWRpYW4geS1heGlzKQorICphcmVhKiAoeC1heGlzIElRUiAqIHktYXhpcyBJUVIpCgpgYGB7cn0KIyBjb21wdXRlIHZpZXdpbmcgbWV0cmljcwp2aWV3aW5nX21ldHJpY3MgPC0gdmlld2luZyAlPiUKICBncm91cF9ieShwYXJ0aWNpcGFudCwgZGlyZWN0aW9uLCBtZWRpYSkgJT4lCiAgc3VtbWFyaXNlKAogICAgdXBwZXIgPSBxdWFudGlsZSh5LG5hLnJtPVRSVUUpW1syXV0sCiAgICBsb3dlciA9IHF1YW50aWxlKHksbmEucm09VFJVRSlbWzRdXSwKICAgIGxlZnQgPSBxdWFudGlsZSh4LG5hLnJtPVRSVUUpW1syXV0sCiAgICByaWdodCA9IHF1YW50aWxlKHgsbmEucm09VFJVRSlbWzRdXSwKICAgIHdpZHRoID0gSVFSKHgsbmEucm09VFJVRSksCiAgICBoZWlnaHQgPSBJUVIoeSxuYS5ybT1UUlVFKSwKICAgIHhfY2VudGVyID0gbWVkaWFuKHgsbmEucm09VFJVRSksCiAgICB5X2NlbnRlciA9IG1lZGlhbih5LG5hLnJtPVRSVUUpLAogICAgYXJlYSA9IHdpZHRoKmhlaWdodAogICAgKQoKIyBhdmVyYWdlIGFjcm9zcyB0d28gc3RvcmllcyBmb3IgZWFjaCBkaXJlY3Rpb24Kdmlld2luZ19tZXRyaWNzIDwtIHZpZXdpbmdfbWV0cmljcyAlPiUKICBncm91cF9ieShwYXJ0aWNpcGFudCwgZGlyZWN0aW9uKSAlPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgZnVucyhtZWFuKC4sIG5hLnJtID0gVFJVRSkpKQoKaGVhZCh2aWV3aW5nX21ldHJpY3MsMTApCmBgYAoKTm93IEknbGwgam9pbiB0aGUgYmVoYXZpb3JhbCBkYXRhIHdpdGggdGhlIHZpZXdpbmcgc3BhY2UgbWV0cmljcy4gQmVsb3cgaXMgYW4gZXhhbXBsZSBvZiB0aGUgZm9yd2FyZCB0YWJsZSBmb3Igdmlld2luZyBzcGFjZSBhbmQgYmVoYXZpb3JhbCBkYXRhCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEdldCBiZWhhdmlvcmFsIG1lYXN1cmVzCmV5ZXBlcmZfZndydiA8LSBmdWxsZGF0YSAlPiUKICBmaWx0ZXIoZXllX2V4Y2x1ZGUgPT0gRkFMU0UpICU+JQogIHNlbGVjdChwYXJ0aWNpcGFudCwgbWFpbmdyb3VwLCBoZWFyaW5nLCBkaXJlY3Rpb24sIGFvYXNsLCBzaWdueXJzLCBzZWxmcmF0ZSwgYWNjLCBnaXN0LCBleWVzLCBtb3V0aCwgbmVjaywgZmFjZWNoZXN0KSAlPiUKICBncm91cF9ieShtYWluZ3JvdXAsIHBhcnRpY2lwYW50LCBkaXJlY3Rpb24pICU+JQogIG11dGF0ZShnaXN0ID0gbWVhbihnaXN0LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBsZXggPSBtZWFuKGFjYywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgZXllcyA9IG1lYW4oZXllcywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgbW91dGggPSBtZWFuKG1vdXRoLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBuZWNrID0gbWVhbihuZWNrLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBmYWNlY2hlc3QgPSBtZWFuKGZhY2VjaGVzdCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdChtYWluZ3JvdXAsIHBhcnRpY2lwYW50LCBoZWFyaW5nLCBkaXJlY3Rpb24sIGFvYXNsLCBzaWdueXJzLCBzZWxmcmF0ZSwgZ2lzdCwgbGV4KSAlPiUKICBkaXN0aW5jdCgpCgp2aWV3aW5nX21ldHJpY3NfYmVoYXYgPC0gCiAgbGVmdF9qb2luKHZpZXdpbmdfbWV0cmljcywgZXllcGVyZl9md3J2LCBieSA9IGMoInBhcnRpY2lwYW50IiwiZGlyZWN0aW9uIikpICU+JQogIGZpbHRlcighaXMubmEobWFpbmdyb3VwKSkgJT4lCiAgc2VsZWN0KHBhcnRpY2lwYW50LCBkaXJlY3Rpb24sIGhlYXJpbmcsIG1haW5ncm91cDpsZXgsIHVwcGVyOmFyZWEpICU+JQogIGdhdGhlcihtZXRyaWMsIHZhbHVlLCBnaXN0OmFyZWEpICU+JQogIHVuaXRlKG1ldHJpY3ZhbHVlLCBjKG1ldHJpYywgZGlyZWN0aW9uKSwgc2VwID0gIl8iLCByZW1vdmUgPSBGQUxTRSkgJT4lCiAgc2VsZWN0KC1tZXRyaWMpICU+JQogIHNwcmVhZChtZXRyaWN2YWx1ZSwgdmFsdWUpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoLXBhcnRpY2lwYW50LCAtbWFpbmdyb3VwKQoKdmlld2luZ19mdyA8LSB2aWV3aW5nX21ldHJpY3NfYmVoYXYgJT4lIAogIGZpbHRlcihkaXJlY3Rpb24gPT0gImZvcndhcmQiKSAlPiUgCiAgc2VsZWN0KGhlYXJpbmcsCiAgICAgICAgIGFvYXNsLAogICAgICAgICBzaWdueXJzLAogICAgICAgICBzZWxmcmF0ZSwKICAgICAgICAgZ2lzdF9mb3J3YXJkLCAKICAgICAgICAgbGV4X2ZvcndhcmQsIAogICAgICAgICB1cHBlcl9mb3J3YXJkLCAKICAgICAgICAgbG93ZXJfZm9yd2FyZCwgCiAgICAgICAgIGxlZnRfZm9yd2FyZCwgCiAgICAgICAgIHJpZ2h0X2ZvcndhcmQsIAogICAgICAgICB3aWR0aF9mb3J3YXJkLCAKICAgICAgICAgaGVpZ2h0X2ZvcndhcmQsIAogICAgICAgICB4X2NlbnRlcl9mb3J3YXJkLCAKICAgICAgICAgeV9jZW50ZXJfZm9yd2FyZCwKICAgICAgICAgYXJlYV9mb3J3YXJkKQp2aWV3aW5nX2Z3X2RlYWYgPC0gdmlld2luZ19mdyAlPiUKICBmaWx0ZXIoaGVhcmluZyA9PSAiRGVhZiIpICU+JQogIHNlbGVjdCgtaGVhcmluZykKdmlld2luZ19md19oZWFyaW5nIDwtIHZpZXdpbmdfZncgJT4lCiAgZmlsdGVyKGhlYXJpbmcgPT0gIkhlYXJpbmciKSAlPiUKICBzZWxlY3QoLWhlYXJpbmcpCnZpZXdpbmdfcnYgPC0gdmlld2luZ19tZXRyaWNzX2JlaGF2ICU+JSAKICBmaWx0ZXIoZGlyZWN0aW9uID09ICJyZXZlcnNlZCIpICU+JSAKICBzZWxlY3QoaGVhcmluZywKICAgICAgICAgYW9hc2wsCiAgICAgICAgIHNpZ255cnMsCiAgICAgICAgIHNlbGZyYXRlLAogICAgICAgICBnaXN0X3JldmVyc2VkLCAKICAgICAgICAgbGV4X3JldmVyc2VkLCAKICAgICAgICAgdXBwZXJfcmV2ZXJzZWQsIAogICAgICAgICBsb3dlcl9yZXZlcnNlZCwgCiAgICAgICAgIGxlZnRfcmV2ZXJzZWQsIAogICAgICAgICByaWdodF9yZXZlcnNlZCwgCiAgICAgICAgIHdpZHRoX3JldmVyc2VkLCAKICAgICAgICAgaGVpZ2h0X3JldmVyc2VkLCAKICAgICAgICAgeF9jZW50ZXJfcmV2ZXJzZWQsIAogICAgICAgICB5X2NlbnRlcl9yZXZlcnNlZCwKICAgICAgICAgYXJlYV9yZXZlcnNlZCkKdmlld2luZ19ydl9kZWFmIDwtIHZpZXdpbmdfcnYgJT4lCiAgZmlsdGVyKGhlYXJpbmcgPT0gIkRlYWYiKSAlPiUKICBzZWxlY3QoLWhlYXJpbmcpCnZpZXdpbmdfcnZfaGVhcmluZyA8LSB2aWV3aW5nX3J2ICU+JQogIGZpbHRlcihoZWFyaW5nID09ICJIZWFyaW5nIikgJT4lCiAgc2VsZWN0KC1oZWFyaW5nKQoKdmlld2luZ19mdyA8LSBzZWxlY3Qodmlld2luZ19mdywgLWhlYXJpbmcpCnZpZXdpbmdfcnYgPC0gc2VsZWN0KHZpZXdpbmdfcnYsIC1oZWFyaW5nKQoKaGVhZCh2aWV3aW5nX2Z3LDEwKQpgYGAKCiMjIERlYWYgVmlld2luZyBDb3JyZWxhdGlvbnMsIEZvcndhcmQKYGBge3Igcm93cy5wcmludCA9IDE1fQpwcmludCgiQ29ycmVsYXRpb25zIC0gUGVhcnNvbidzIHIiKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KHZpZXdpbmdfZndfZGVhZikpJHIKcHJpbnQoIkNvcnJlbGF0aW9ucyAtIFAtdmFsdWVzIikKSG1pc2M6OnJjb3JyKGFzLm1hdHJpeCh2aWV3aW5nX2Z3X2RlYWYpKSRQCmNvcnN0YXJzbCh2aWV3aW5nX2Z3X2RlYWYpCmBgYAojIyBEZWFmIFZpZXdpbmcgQ29ycmVsYXRpb25zLCBSZXZlcnNlZApgYGB7ciByb3dzLnByaW50ID0gMTV9CnByaW50KCJDb3JyZWxhdGlvbnMgLSBQZWFyc29uJ3MgciIpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgodmlld2luZ19ydl9kZWFmKSkkcgpwcmludCgiQ29ycmVsYXRpb25zIC0gUC12YWx1ZXMiKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KHZpZXdpbmdfcnZfZGVhZikpJFAKY29yc3RhcnNsKHZpZXdpbmdfcnZfZGVhZikKYGBgCgojIyBIZWFyaW5nIFZpZXdpbmcgQ29ycmVsYXRpb25zLCBGb3J3YXJkCmBgYHtyIHJvd3MucHJpbnQgPSAxNX0KcHJpbnQoIkNvcnJlbGF0aW9ucyAtIFBlYXJzb24ncyByIikKSG1pc2M6OnJjb3JyKGFzLm1hdHJpeCh2aWV3aW5nX2Z3X2hlYXJpbmcpKSRyCnByaW50KCJDb3JyZWxhdGlvbnMgLSBQLXZhbHVlcyIpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgodmlld2luZ19md19oZWFyaW5nKSkkUApjb3JzdGFyc2wodmlld2luZ19md19oZWFyaW5nKQpgYGAKIyMgSGVhcmluZyBWaWV3aW5nIENvcnJlbGF0aW9ucywgUmV2ZXJzZWQKYGBge3Igcm93cy5wcmludCA9IDE1fQpwcmludCgiQ29ycmVsYXRpb25zIC0gUGVhcnNvbidzIHIiKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KHZpZXdpbmdfcnZfaGVhcmluZykpJHIKcHJpbnQoIkNvcnJlbGF0aW9ucyAtIFAtdmFsdWVzIikKSG1pc2M6OnJjb3JyKGFzLm1hdHJpeCh2aWV3aW5nX3J2X2hlYXJpbmcpKSRQCmNvcnN0YXJzbCh2aWV3aW5nX3J2X2hlYXJpbmcpCmBgYAojIyBBbGwgVmlld2luZyBDb3JyZWxhdGlvbnMsIEZvcndhcmQKYGBge3Igcm93cy5wcmludCA9IDE1fQpwcmludCgiQ29ycmVsYXRpb25zIC0gUGVhcnNvbidzIHIiKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KHZpZXdpbmdfZncpKSRyCnByaW50KCJDb3JyZWxhdGlvbnMgLSBQLXZhbHVlcyIpCkhtaXNjOjpyY29ycihhcy5tYXRyaXgodmlld2luZ19mdykpJFAKY29yc3RhcnNsKHZpZXdpbmdfZncpCmBgYAojIyBBbGwgVmlld2luZyBDb3JyZWxhdGlvbnMsIFJldmVyc2VkCmBgYHtyIHJvd3MucHJpbnQgPSAxNX0KcHJpbnQoIkNvcnJlbGF0aW9ucyAtIFBlYXJzb24ncyByIikKSG1pc2M6OnJjb3JyKGFzLm1hdHJpeCh2aWV3aW5nX3J2KSkkcgpwcmludCgiQ29ycmVsYXRpb25zIC0gUC12YWx1ZXMiKQpIbWlzYzo6cmNvcnIoYXMubWF0cml4KHZpZXdpbmdfcnYpKSRQCmNvcnN0YXJzbCh2aWV3aW5nX3J2KQpgYGAKCg==